Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: __get na dwa sposoby
Forum PHP.pl > Forum > PHP > Object-oriented programming
deirathe
  1. <?php
  2. class TemplateParam
  3. {
  4. public $value;
  5. public $children;
  6. public $attributes;
  7. public function __construct($value)
  8. {
  9. $this->value = $value;
  10. }
  11. public function setAttribute($name,$value)
  12. {
  13. $this->attributes[$name] = $value;
  14. }
  15. public function dropAttribute($name)
  16. {
  17. unset($this->attributes[$name]);
  18. }
  19. public function __get($name)
  20. {
  21. return $this->children[$name];
  22. }
  23. }
  24. class Template {
  25.  
  26. public $templateData;
  27.  
  28. public function __set($name,$value)
  29. {
  30.  $this->templateData[$name] = new TemplateValue($value);
  31. }
  32. public function __get($name)
  33. {
  34. return $this->templateData[$name];
  35. }
  36. }
  37. ?>

Mam takie klasy i natknalem sie na pewien problem, nie wiem jak to rozwiazac chce aby __get w klasie TemplateValue dzialalo na dwa sposoby, jezeli zwracam sie
$Template->zmienna = "lalala" to tworzy sie obiekt klasy TemplateValue i zmienna value przybiera wartosc "lalala", jezeli wykonam $Template->zmienna->zmienna2 to __get zwraca mi zmienna $children[$zmienna2]->value jezeli wykonam $Template->zmienna->zmienna2 to dostaje $children[$zmienna2]->value a jak $Template->zmienna->zmienna2->zmienna3 to $children[$zmienna2->children[$zmienna3]]->value, nie wiem czy dobrze wytlumaczylem
LBO
Teraz zrozumiałem o co Tobie chodziło.

Nie da rady tego zrobić, gdyż klasy nie posiadają wiadomości o tym, czy są wywoływane jako obiekty, czy jako wartości.
Gdyby istniała metoda typu toValue() (czyli przypisywanie obiektu bez kontekstu , nie tak jak toString()) to jak najbardziej a póki co, działa to prawie tak samo jak tablice.

Jeżeli nie będzie to Tobie przeszkadzać, to tutaj masz implementacje w jednej klasie
  1. <?php
  2. class Container
  3. {
  4. /*
  5.  * Array of Container objects
  6.  * 
  7.  * @var Container
  8.  */
  9. protected $values = array();
  10.  
  11. public function __set($name,$value)
  12. {
  13. $this->values[$name] = $value;
  14. }
  15.  
  16. public function __get($name)
  17. {
  18. if(key_exists($name, $this->values)) {
  19. return $this->values[$name];
  20. } else {
  21. return $this->values[$name] = new Container();
  22. }
  23. }
  24. }
  25.  
  26. $container = new Container();
  27. $container->a->b = 4;
  28. $container->b = 12;
  29.  
  30. // ale 
  31.  
  32. $container->a = 1000; // nadpisze obiekt stracisz $a->b, nie da się tego obejść
  33. ?>
deirathe
szkoda, tak samo brakuje mi czasem przeladowania operatorow sad.gif w php sad.gif
dzieki za odpowiedz
likemandrake
Oj jakby się dało przeładowywać operatory, to w PHP możnaby pisać aplikacje z pełną kontrolą typów, po za tym tak jak w Javie, czy JavaScript'cie każdy typ danych możnaby zrobić obiektem wraz z odpowiednimi metodami do operowania dana wartoscia... W w/w wspomnianych jezykach jest to bardzo fajna funkcjonalność i mam nadzieję, że nie muszę tłumaczyć dlaczego smile.gif
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.