Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> problem z __set()
marcinek37
post 2.07.2012, 13:37:13
Post #1





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Crozin
post 2.07.2012, 13:46:54
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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()?
Go to the top of the page
+Quote Post
marcinek37
post 2.07.2012, 13:51:08
Post #3





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
lukaskolista
post 3.07.2012, 08:31:29
Post #4





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

Ostrzeżenie: (0%)
-----


echo $a->atrybut wywola metode __get(), a nie __set().

Ten post edytował lukaskolista 3.07.2012, 08:31:44
Go to the top of the page
+Quote Post
marcinek37
post 3.07.2012, 09:15:02
Post #5





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

Ostrzeżenie: (0%)
-----


  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"...
Go to the top of the page
+Quote Post
destroyerr
post 3.07.2012, 09:28:24
Post #6





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Spawnm
post 3.07.2012, 10:08:05
Post #7





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




daj private lub protected dla $atrybut.
Go to the top of the page
+Quote Post
szok
post 3.07.2012, 11:23:27
Post #8





Grupa: Zarejestrowani
Postów: 165
Pomógł: 20
Dołączył: 2.03.2006

Ostrzeżenie: (0%)
-----


__set() przy $object->costam = bleble;
__get() przy echo $object->costam;


--------------------
Go to the top of the page
+Quote Post
marcinek37
post 3.07.2012, 16:07:22
Post #9





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

Ostrzeżenie: (0%)
-----


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?

Ten post edytował marcinek37 3.07.2012, 16:07:41
Go to the top of the page
+Quote Post
Crozin
post 3.07.2012, 16:15:24
Post #10





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Crozin 3.07.2012, 16:16:12
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 11:54