Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> __get na dwa sposoby
deirathe
post 20.08.2008, 14:30:29
Post #1





Grupa: Zarejestrowani
Postów: 426
Pomógł: 32
Dołączył: 24.05.2007

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


  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


--------------------
Kawałek mojego blogu
Everything should be as simple as possible but not simpler.
A Einstein
Go to the top of the page
+Quote Post
LBO
post 20.08.2008, 15:32:13
Post #2





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


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. ?>


Ten post edytował LBO 20.08.2008, 18:04:16
Go to the top of the page
+Quote Post
deirathe
post 20.08.2008, 20:13:45
Post #3





Grupa: Zarejestrowani
Postów: 426
Pomógł: 32
Dołączył: 24.05.2007

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


szkoda, tak samo brakuje mi czasem przeladowania operatorow sad.gif w php sad.gif
dzieki za odpowiedz


--------------------
Kawałek mojego blogu
Everything should be as simple as possible but not simpler.
A Einstein
Go to the top of the page
+Quote Post
likemandrake
post 24.08.2008, 22:13:58
Post #4





Grupa: Zarejestrowani
Postów: 175
Pomógł: 17
Dołączył: 23.06.2006

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


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


--------------------
serwiswww.pl
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: 24.07.2025 - 13:57