Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Klasy a tablice
Forum PHP.pl > Forum > Przedszkole
dudzisz
Witam!
Nie wiem czy w dobrym miejscu pisze, ale pewnie tak bo to przedszkole, a ja jestem początkujący.
Mam następujący problem. Chciałem stworzyć klasę koszyk następująco:

class Koszyk
{
public $id;
public $nazwa;
public $cena;
public $ilosc;


public function wypisz()
{
$i=1;
while(isset($this[$i])) {
if ($this[$i]->ilosc >0) {
print "".$this[$i]->id." ".$this[$i]->nazwa." ".$this[$i]->cena." ".$this[$i]->ilosc."";}
$i++; }
}

public function dodaj($id,$nazwa,$cena)
{
$z=0;
$i=1;
while(isset($this[$i])) {
if ($this[$i]->id == $id) {$z=$id;}
$i++; }
if ($z==0) {
$j=1;
while(isset($this[$j])) {
$j++;}
$this[$j] = new Koszyk;
$this[$j]->ip = $ip;
$this[$j]->nazwa = $nazwa;
$this[$j]->cena = $cena;
$this[$j]->ilosc = 1;
}
else {$this[$j]->ilosc++;}
}
}

gdy wpisuję $Kosz->wypisz() lub $Kosz->dodaj(x,y,z) wyrzuca "Cannot use object of type Kosz as array in...".
Dlaczego tego nie może potraktować jako tablicy? Można to jakoś poprawić, czy cały pomysł jest do niczego?
Będę wdzięczny za pomoc, bo już nawet nie wiem gdzie szukać.
kreator
Po pierwsze, jak dajesz kod, to umieszczaj go jako kod

Rozumiem, że każda tablica zawiera inny element (np. id, nazwe itd). Ja bym trochę inaczej to napisał. Ale błędem u Ciebie jest to, że piszesz $this[$i]->id co jest całkowicie bez sensu, bo Ty chcesz się zwrócić do elementu $i w tablicy id, a nie w $this, które jest wskaźnikiem, że dana zmienna jest w tej klasie.
Czyli powinno być
Kod
$this->id[$i]

I tak we wszystkich.


@EDIT
Mój kod był nieciekawy tongue.gif Jak już to powiedział Pan niżej biggrin.gif
piaseq
Cytat(kreator @ 28.02.2009, 08:25:39 ) *
Po pierwsze, jak dajesz kod, to umieszczaj go jako kod

Bardzo słuszna uwaga, należałoby dodać, że kod php powinien być umieszczany w tagach php zamiast code, będzie o wiele czytelniejszy.


Cytat(kreator @ 28.02.2009, 08:25:39 ) *
Napisałem na szybko coś swojego na wzór Twojego. Głowy nie dam czy będzie działać, jeżeli coś jest źle to mi wybaczcie bo pisałem to na szybko bez testowania itd ;]

Ten kod jest zupełnie nie przemyślany, nie mam tu na myśli błędów składniowych, ale ogólnego schematu działania tego kodu. Do rzeczy:

Cytat(kreator @ 28.02.2009, 08:25:39 ) *
  1. <?php
  2.              
  3.              class Koszyk
  4.              {
  5.                  public $produkt;
  6.                  public $produkty;
  7. }
  8. ?>

Zupełnie nie wiem po co przechowywać w klasie jednocześnie pojedynczy produkt i tablicę produktów.

Cytat(kreator @ 28.02.2009, 08:25:39 ) *
  1. <?php
  2. public function wypisz() {
  3.                  for($i=0;$i<count($this->produkty);$i++) {
  4.                      if ($this->produkty['ilosc'] >0) {
  5.                          print "".$this->produkty['id']." ".$this->produkty['nazwa']." ".$this->produkty['cena']."
  6.            ".$this->produkty['ilosc']."";
  7.        }
  8.                      $i++;
  9.                   }
  10.              }
  11. ?>

Ta funkcja wg. mnie nie ma żadnego sensu. Iterujesz po zmiennej $i, której ani razu nie użyłeś wewnątrz pętli. Moim skromnym zdaniem cała klasa zawiera liczne błędy logiczne w podejściu obiektowym.

Według mnie prywatna właściwość produkty powinna być tablicą przechowującą obiekty klasy Produkt. Funkcja dodaj powinna zajmować się dopisywaniem obiektów klasy produkt do tej tablicy. Natomiast funkcja wypisz powinna zostać zastąpiona funkcją pobierzProdukt, która zwracałaby pojedynczy produkt.

Mój opis klasy Koszyk jest niekompletny i przedstawia tylko podstawowe założenia, aby klasa była bardziej zgodna z podejściem OOP. Oczywiście jest to tylko jedno z możliwych podejść.
kreator
@up

Wiem że może być sporo błędów, bo raz jestem jeszcze trochę początkującym programistą, a dwa miałem na to może 5 minut ;]
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.