Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z __set()
Forum PHP.pl > Forum > PHP
marcinek37
Mam kod:
  1. <?
  2. class test{
  3. public $atrybut = 'domyslna wartosc';
  4.  
  5. public function __set($nazwa, $wartosc){
  6. if($nazwa == 'atrybut'){ $this->$nazwa = 'test'; }
  7. else{ $this->$nazwa = $wartosc; }
  8. }
  9.  
  10. }
  11.  
  12.  
  13. $a = new test();
  14. $a->atrybut = 'xyz';
  15. echo $a->atrybut;
  16. ?>


chciałem, aby z automatu atrybut o nazwie "atrybut" zmieniał wartość na "test", ale się nie udaje - strona pokazuje "xyz"
używam webserva, na którym mam zainstalowane PHP 5.2.5
Crozin
1. Jeżeli istnieje zadeklarowana właściwość $atrybut, __set() nie zostanie wywołane - metoda ta wywoływana jest przy próbie zapisu do nieistniejącej właściwości.
2. Po co w ogóle używasz tutaj __set()?
marcinek37
uczę się i staram się to zrozumieć
przerobiłem kod, spójrz na niego:
  1. <?
  2. class test{
  3. public function __set($nazwa, $wartosc){
  4. if($nazwa == 'atrybut'){ $this->$nazwa = 'test'; }
  5. else{ $this->$nazwa = $wartosc; }
  6. }
  7.  
  8. }
  9.  
  10.  
  11. $a = new test();
  12. echo $a->atrybut;
  13. ?>


w tym momencie atrybut "atrybut" faktycznie nie istnieje - gdy go używam, strona jest pusta...
lukaskolista
echo $a->atrybut wywola metode __get(), a nie __set().
marcinek37
  1. <?
  2. class test{
  3. public $atrybut;
  4.  
  5. public function __set($nazwa, $wartosc){
  6. if($nazwa == 'atrybut'){ $this->$nazwa = 'test'; }
  7. else{ $this->$nazwa = $wartosc; }
  8. }
  9.  
  10. }
  11.  
  12.  
  13. $a = new test();
  14. echo $a->atrybut = '5';
  15. ?>


teraz wywoła __set, ale i tak przyjmie wartość "5", a nie "test"...
destroyerr
Cytat
1. Jeżeli istnieje zadeklarowana właściwość $atrybut, __set() nie zostanie wywołane - metoda ta wywoływana jest przy próbie zapisu do nieistniejącej właściwości.

Czyli nie wywoła __set.
Spawnm
daj private lub protected dla $atrybut.
szok
__set() przy $object->costam = bleble;
__get() przy echo $object->costam;
marcinek37
ciągle tego nie rozumiem

aktualnie mam coś takiego:
  1. <?
  2. class test{
  3. public $atrybut;
  4.  
  5. public function __set($nazwa, $wartosc){
  6. if($nazwa == 'atrybut'){ $this->$nazwa = 'test'; }
  7. else{ $this->$nazwa = $wartosc; }
  8. }
  9.  
  10. }
  11.  
  12. $a = new test();
  13. $a->atrybut = '5';
  14. echo $a->atrybut;
  15. ?>


i nadal pokazuje się "5", a chcę, aby pokazało się "test"... nadal nie rozumiem, do czego służy __set, może ktoś mi podać mega szczupły kod, który wyjaśni działanie?
Crozin
1. http://php.net/manual/en/language.oop5.overloading.php
2. "__set() is run when writing data to inaccessible properties."
3. Właściwość jest dostępna gdy a) jest zadeklarowana cool.gif ma odpowiednią widoczność. W Twoim przypadku właściwość jest zadeklarowana, a jej widoczność to public czyli jest widoczna spoza obiektu.
4. Teraz już chyba oczywiste jest dlaczego nie wywołuje Ci się __set().

Cytat
nadal nie rozumiem, do czego służy __set
Można by powiedzieć, że właściwie nie posiada praktycznego zastosowania.
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.