Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z private
Forum PHP.pl > Forum > PHP > Object-oriented programming
Sevilanios
Witam,

mam taki kod

  1. class klasa
  2. {
  3. private $zmienna;
  4.  
  5. function __get($zmienna)
  6. {
  7. return $this->$zmienna;
  8. }
  9.  
  10. function __set($zmienna,$wartosc)
  11. {
  12. $this->$zmienna = $wartosc;
  13. }
  14. }
  15.  
  16. $_SESSION['klasa'] = new klasa;
  17.  
  18. $_SESSION['klasa']->zmienna = 5;
  19.  
  20. echo $_SESSION['klasa']->zmienna;
  21.  


Z tego co wiem, powinno wywalać błąd, jednak u mnie wszystko normalnie się wykonuje, tak, jak by $zmienna miałą publiczny dostęp. Robię coś źle czy mam coś źle ustawione w php?
redeemer
Masz tam "magiczne metody" __get i __set ( http://php.net/manual/en/language.oop5.magic.php )
sowiq
Zrób jak poniżej i sam odpowiedz sobie na pytanie smile.gif
  1. function __set($zmienna, $wartosc)
  2. {
  3. echo 'calling __set';
  4. $this->$zmienna = $wartosc;
  5. }
Piotrbaz
$this->zmienna;

zamiast

$this->$zmienna;

?
adbacz
No dobrze, ale czy te metody nie działają czasami tylko w tedy, gdy danej właściwości klasy nie ma? Gdy właściwość jest prywatna to ona istnieje więc metoda __get() nie powinna działać.
webdice
Cytat(adbacz @ 8.10.2012, 07:22:39 ) *
No dobrze, ale czy te metody nie działają czasami tylko w tedy, gdy danej właściwości klasy nie ma? Gdy właściwość jest prywatna to ona istnieje więc metoda __get() nie powinna działać.


Nic podobnego. Metoda __get oraz __set należą do klasy i ma takie uprawnienia jak każda inna metoda.
sowiq
Cytat(adbacz @ 8.10.2012, 07:22:39 ) *
No dobrze, ale czy te metody nie działają czasami tylko w tedy, gdy danej właściwości klasy nie ma? Gdy właściwość jest prywatna to ona istnieje więc metoda __get() nie powinna działać.


A zajrzałeś najpierw do manuala? http://www.php.net/manual/en/language.oop5....php#object.set powiada:
Cytat
__set() is run when writing data to inaccessible properties.
__get() is utilized for reading data from inaccessible properties.


BTW, jak zauważył Piotrbaz, w __set i __get powinieneś używać $this->zmienna = $wartosc;, a nie $this->$zmienna = $wartosc;
redeemer
Cytat(sowiq @ 8.10.2012, 09:01:20 ) *
BTW, jak zauważył Piotrbaz, w __set i __get powinieneś używać $this->zmienna = $wartosc;, a nie $this->$zmienna = $wartosc;
Takie użycie __set i __get mija się z celem, bo w ten sposób zawsze będziesz "nadpisywał" atrybut klasy o nazwie "zmienna", a wartość pierwszego argumentu __set i __get będzie ignorowana.
sowiq
@redeemer, oczywiście masz rację. Dzięki za poprawienie.
hedrazer
Cytat(redeemer @ 8.10.2012, 10:50:19 ) *
Takie użycie __set i __get mija się z celem, bo w ten sposób zawsze będziesz "nadpisywał" atrybut klasy o nazwie "zmienna", a wartość pierwszego argumentu __set i __get będzie ignorowana.


a tak na prawdę to odwołanie nastąpi do atrybutu o nazwie, która odpowiada wartości przechowywanej przez zmienna $zmienna

Examle
  1. <pre><?php
  2. class foo {
  3. private $_bar;
  4. public function __get($name) {
  5. if(!array_key_exists($name, (array)get_class_vars(get_class()))) {
  6. trigger_error('Unkonwn class attribute', E_USER_WARNING);
  7. return NULL;
  8. }
  9. return $this->$name;
  10. }
  11. }
  12. $foo = new foo;
  13. $attribName = '_bar';
  14. echo 'Debug for: '.$attribName.'<br/>';
  15. var_dump($foo->$attribName);
  16.  
  17. $attribName = '_sthAttrib';
  18. echo 'Debug for: '.$attribName.'<br/>';
  19. var_dump($foo->$attribName);
  20.  
  21. ?>


  1. Debug for: _bar
  2. string(10) "_bar value"
  3. Debug for: _sthAttrib
  4. Warning: Unkonwn class attribute in /home/user/public_html/tests/t1/index.php on line 9
  5. NULL
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.