Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] problem z wlasnymi klasami i tablica
Forum PHP.pl > Forum > Przedszkole
mromar2
Programuje obiektowo kilka lat w C++ i nie mialem nigdy wiekszych problemow
a tu w php mam tylko 2 klasy i nie moge dojsc o co chodzi

pierwsza klasa

  1. <?php
  2. class przedzial{
  3.  
  4. var $p;
  5. var $k;
  6. function przedzial() {
  7. $this->p=0;
  8. $this->k=0;
  9. }  
  10. function przedzial_($P, $K){
  11. $this->p=$P;
  12. $this->k=$K;
  13. }
  14. //i jeszcze inne fukcje
  15.  
  16. ?>


a potem mam druga klase w ktorej chce miec tablice elementow pierwszej klasy


  1. <?php
  2.  
  3. class rozmyty{
  4. var $tab;
  5. var $a;
  6. var $b;
  7. var $c;
  8. var $d;  
  9. function rozmyty(){
  10. $this->a=0; $this->b=0;
  11. $this->c=0; $this->d=0; 
  12. }
  13. function rozmyty__($a_,$b_,$c_,$d_){
  14. $i=0;
  15. for($j=0;$j<11;++$j){
  16. $this->tab[j]= new przedzial;
  17. $this->tab[j]->p=($i*($b_-$a_))+$a_;
  18. $this->tab[j]->k=($i*($c_-$d_))+$d_;
  19. $i=$i+0.1;
  20.  
  21. }
  22. //i jeszce inne funkcje
  23. }
  24. ?>


problem w tym ze gdy zrobie w ten sposob

  1. <?php
  2.  
  3. $d2= new rozmyty;
  4. $d2->rozmyty__(2,1,5,8);
  5.  
  6. echo "".$d2->tab[0]->k."<br>";
  7.  
  8. ?>


to nic sie nie pojawia bo $k pozostaje puste
tak jak by rozmyty__(2,1,5,8) nie zapisalo nic do tej tablicy tab


pojawia sie dopiero gdy zrobie tak

  1. <?php
  2.  
  3. $d=new przedzial;
  4.  
  5. $d2= new rozmyty;
  6. $d2->tab[0]=$d;
  7. echo "".$d2->tab[0]->k."<br>";
  8.  
  9. ?>


kto mi powie czemu ta tablica pozostaje pusta??
czego tu brakuje??
nospor
  1. <?php
  2. $this->tab[j]= new przedzial;
  3. $this->tab[j]->p=($i*($b_-$a_))+$a_;
  4. $this->tab[j]->k=($i*($c_-$d_))+$d_;
  5.  
  6. ?>

zamien na:
  1. <?php
  2. $this->tab[$j]= new przedzial;
  3. $this->tab[$j]->p=($i*($b_-$a_))+$a_;
  4. $this->tab[$j]->k=($i*($c_-$d_))+$d_;
  5.  
  6. ?>
smile.gif
mromar2
sadsmiley02.gif
a ja sie dwa dni w to patrzylem i szukalem bledu
porazka tiredsmiley.gif
musze sobie okulary sprawic cool.gif

a tak po za tym to czemu Zend mi to przepuscil bez ostrzezenia,
i na serwerze tez otwieralo sie bez bledu??
nospor
taki zapis tab[j] bedzie traktowany jako tab['j']. a to nie jest błąd tylko NOTICE, ktory zreszrtą jest wywalany:
Cytat
Notice: Use of undefined constant j - assumed 'j' in ...
trzeba miec tylko raportowanie ustawione odpowiednio.
mike
Cytat(nospor @ 2006-03-27 16:39:36)
taki zapis tab[j] bedzie traktowany jako tab['j']. a to nie jest błąd tylko NOTICE, ktory zreszrtą jest wywalany:
Cytat
Notice: Use of undefined constant j - assumed 'j' in ...
trzeba miec tylko raportowanie ustawione odpowiednio.

No niby tak, ale to siedzi troche głębiej.

Zapis $tab[j] jest całkowicie poprawny (dlatego Zend nic nie mówił). Szukamy po prostu w tablicy $tab elementu o indeksie zdefiniowanym przez stałą j. Stała ta nie została wcześniej zdefiniowana więc php przy pierwszej próbie jej użycia wywala komunikat typu E_NOTICE oraz automatycznie tworzy tą stałą nadając jej wartość taką samą jaka jest jej nazwa. Dlatego wrażenie jest że jest to to samo co $tab['j']. A tak nie jest. To nadal jest tab[j]. Tylko tmy razem stała j jest już zdefiniowana.

Jest to swego rodzaju niuans.

Wyjściem z tej sytuacji nie jest odpowiednie ustawienie error_reporting, bo to jest ominięcie prolemu, zresztą bardzo złe, a nie jego rozwiązanie.

Rozwiązaniem jest pisanie nazw w apostrofach: $tab[ 'j' ]
nospor
Cytat
Dlatego wrażenie jest że jest to to samo co $tab['j']. A tak nie jest. To nadal jest tab[j]. Tylko tmy razem stała j jest już zdefiniowana.
to mialem na mysli, tylko źle to ubralem w slowa. a raczej skrócilem mysl winksmiley.jpg

Cytat
Rozwiązaniem jest pisanie nazw w apostrofach: $tab[ 'j' ]
nie, nie winksmiley.jpg rozwiązaniem jest pisanie: $tab[$j] tongue.gif oto tu wlasnie chodzilo winksmiley.jpg
---
No właśnie. Za daleko w teorię zabrnąłem. Chodziło mi o $tab[$j] tongue.gif
~mike_mech
mromar2
a wiec dla potomnych szukających błędów w swych skryptach
najlepiej ustawic w php.ini

error_reporting = E_ALL


bo na ja szukaniu prostych błędów straciłem dwa dni sad.gif
a liczylem ze całe zlecenie zrobie w jeden
mike
Cytat(mromar2 @ 2006-03-28 00:02:31)
error_reporting = E_ALL

Nie zawsze wystarczy.
Należy jeszcze upewnić się, że display_errors jest odpowiednio ustawione:
Kod
display_errors = On
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.