Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Metody magiczne, Czy jest sens stosowania?
JoShiMa
post
Post #1





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


dla mnie to chore wywoływac metodę magiczną wewnątrz klasy.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





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

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


@Eby: Jak można porównywać return do echo? Poza tym ten przykład to też wiele z tematem wspólnego nie ma. Jak już to powinieneś porównać takie zapisy:
  1. echo $helper->tag('a', 'more', array('href'=>'controller::action','class'=>'link'));
  2. echo $helper->helper('tag', 'a', 'more', array('href'=>'controller::action','class'=>'link'));
  3. echo $helper->helper('tag', array('a', 'more', array('href'=>'controller::action','class'=>'link')));
Chociaż osobiście wszystkie uważam za niezbyt trafne.

@wookieb: Co do pierwszego listingu... jest on chyba niekompletny bo kompletnie nie trzyma się kupy - albo ja nie potrafię sobie wyobrazić co ten kod miałby robić (konkretniej metoda __set w przypadku gdy podajemy klucz inny niż "cache"). Poza tym już uwidacznia się tu pierwszy "wtf". Na metodę __set() spada obowiązek wykonywania wielu zadań - czy nie lepiej by było:
  1. function setCache(CacheInterface $cache) {
  2. $this->cache = $cache;
  3. $this->useCache = true;
  4. }
  5.  
  6. public function set($key, $value) {
  7. //...
  8. }
I używać kodu normalnie, tj:
  1. $r = new Resource();
  2. $r->setCache($myCacheImpl);
  3. $r->set('xyz', 'aaa');
  4.  
  5. // zamiast
  6. $r->cache = $myCacheImpl;
  7. $r->xyz = 'aaa';
Raczej nie przekonasz mnie, że interfejs drugiego rozwiązania jest lepszy... bo jak dla mnie to jest on okropny i podatny na błędy.

Cytat
A co gdybym dopisał opcję ustawiania flagi $useCache na false w przypadku usunięcia obiektu Cache?
Dodać metodę odpowiedzialną za usuwanie cache, która po usunięciu zmieni flagę?

Cytat
Klasa to nie tablica, której przypisujemy po prostu wartości do właściwości. Służy do wykonywania konkretnych zadań w których mieści się kontrola nad wartościami w jej wnętrzu.
Gdy pisałem o tablicach/kolekcjach miałem na myśli taką sytuację:
  1. class AbcMyClass {
  2. protected $storage = array();
  3.  
  4. public function get($key, $default = null) {
  5. return array_key_exists($key, $this->storage) ? $this->storage[$key] : $default;
  6. }
  7.  
  8. public function set($key, $value) {
  9. $this->storage[$key] = $value;
  10. }
  11. }
  12.  
  13. class AbcMyClass {
  14. public function __get($key) {
  15. return isset($this->{$key}) ? $this->{$key} : null;
  16. }
  17.  
  18. public function set($key, $value) {
  19. $this->$key = $value;
  20. }
  21. }
Pomijając fakt o ile bardziej podatne na błędy i mniej elastyczne jest drugie rozwiązanie (ograniczone możliwości dla nazwania kluczy, problem gdy nazwa klucza jest w zmiennej) spójrzmy na całą różnicę pomiędzy użyciem obu rozwiązań:
  1. $obj->get('parameterA');
  2. $obj->parameterA;
  3.  
  4. $obj->set('parameterA', 123);
  5. $obj->parameterA = 123;
  6.  
  7. $obj->get($abc->getKey());
  8. $key = $abc->getKey(); $obj->$key; // nie jestem pewien czy $obj->{$abc->getKey()}; zadziała. Zrezstą za używanie zmiennych zmiennych powinno się coś obcinać


Co do drugiego przypadku (z klasą Session). Znowu ten sam problem - dziesiątki IFów. Na pewno żaden z nas nie byłby szczęśliwy mając wykorzystywać tą klasę. Takie rozwiązanie dla mnie byłoby do zaakceptowania wyłącznie w przypadku konieczności zachowania wstecznej kompatybilności. Tj. zakładając, że mamy już kod, klasy, która ma publiczną właściwość "id" musimy dodać jeszcze opcję usuwania użytkownika gdy jest ona fałszem. Paskudne rozwiązanie ale jedno z niewielu jakie pozwala na zachowanie tej nieszczęsnej kompatybilności.
Go to the top of the page
+Quote Post
Eby
post
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 1
Dołączył: 16.10.2007

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


Cytat(Crozin @ 25.02.2011, 13:51:03 ) *
@Eby: Jak można porównywać return do echo? Poza tym ten przykład to też wiele z tematem wspólnego nie ma. Jak już to powinieneś porównać takie zapisy:
  1. echo $helper->tag('a', 'more', array('href'=>'controller::action','class'=>'link'));
  2. echo $helper->helper('tag', 'a', 'more', array('href'=>'controller::action','class'=>'link'));
  3. echo $helper->helper('tag', array('a', 'more', array('href'=>'controller::action','class'=>'link')));
Chociaż osobiście wszystkie uważam za niezbyt trafne.

Wybacz, nie dokładnie opisałem o co mi chodzi przedstawiając jedynie pewien efekt końcowy.
Pisząc o wrapperze "helper" w temacie o metodach magicznych miałem na myśli raczej coś takiego :
  1. <?php
  2. class helper {
  3. protected $_obj = array();
  4. ...
  5. public function __call($name, $arg) {
  6. if ( !isset($this->_obj[ $name]) ) {
  7. $filename = 'View_Helper_' . $name;
  8. require_once( $filename );
  9. $this->_obj[ $name ] = new $filename();
  10. }
  11. return $this->_obj[ $name ];
  12. }
  13. }
  14.  
  15. class View_Helper_Tag {
  16. ...
  17. public function __toString() {
  18. return $this->render();
  19. }
  20. public function render() {
  21. $str = "<".$tag;
  22. ...
  23. if ( in_array($tag, $this->_autoclose) )
  24. $str .= '/>';
  25. else
  26. $str .= '>';
  27. ...
  28. return $str;
  29. }
  30. }

Owszem Twój zapis zrobi to samo, ale ja na końcu mam pewien obiekt z którym mogę coś jeszcze zrobić (idziemy w kierunku aspx i kontrolek) - i wyrzucenie tego na standardowe wyjście jest tylko jedna z możliwości. Twój zapis tego nie umożliwia niestety.
Go to the top of the page
+Quote Post

Posty w temacie
- JoShiMa   Metody magiczne   25.02.2011, 10:13:09
- - wookieb   Nieprawda. Jest sens, jeżeli niesie to za sobą jak...   25.02.2011, 10:14:05
|- - JoShiMa   Cytat(wookieb @ 25.02.2011, 10:14:05 ...   25.02.2011, 10:15:16
- - wookieb   Przykład [PHP] pobierz, plaintext class test ...   25.02.2011, 10:18:58
|- - JoShiMa   Cytat(wookieb @ 25.02.2011, 10:18:58 ...   25.02.2011, 10:26:48
- - Crozin   Sensowność metod magicznych sama w sobie jest spra...   25.02.2011, 10:20:52
- - wookieb   Cytat(Crozin @ 25.02.2011, 10:20:52 )...   25.02.2011, 10:24:34
- - Daiquiri   Nie widzę przeszkód w stosowaniu metod magicznych,...   25.02.2011, 10:28:22
- - wookieb   Chyba jednak nie zdajecie sobie sprawy co mówicie....   25.02.2011, 10:33:46
|- - JoShiMa   Cytat(wookieb @ 25.02.2011, 10:33:46 ...   25.02.2011, 13:41:30
- - Crozin   CytatSłyszałem o tym ale nadal nie widzę powodu by...   25.02.2011, 10:35:58
- - wookieb   Cytat(Crozin @ 25.02.2011, 10:35:58 )...   25.02.2011, 10:44:36
- - Crozin   Przede wszystkim powinieneś myśleć nie o autorze k...   25.02.2011, 11:04:03
- - wookieb   To może podam przykład z życia. [PHP] pobierz, pla...   25.02.2011, 12:26:59
- - thek   To ja dorzucę jeszcze moją uwagę. Funkcje magiczne...   25.02.2011, 12:34:21
- - wookieb   Cytat(thek @ 25.02.2011, 12:34:21 ) T...   25.02.2011, 12:37:50
- - cojack   Dla mnie jest rzeczą okrutną że nie można __set i ...   25.02.2011, 12:43:05
- - Eby   Z mojej perspektywy to trochę tak jakby sprzeczać ...   25.02.2011, 13:06:08
- - thek   Cytat(wookieb @ 25.02.2011, 12:37:50 ...   25.02.2011, 13:39:36
- - Crozin   @Eby: Jak można porównywać return do echo? Poza ty...   25.02.2011, 13:51:03
|- - Eby   Cytat(Crozin @ 25.02.2011, 13:51:03 )...   25.02.2011, 14:11:14
- - cojack   Nudni jesteście, ilu programistów tyle pomysłów ja...   25.02.2011, 14:02:28
- - Zyx   wookieb -> i ja bym ten Twój przykład z życia z...   25.02.2011, 14:12:11
|- - Eby   Cytat(Zyx @ 25.02.2011, 14:12:11 ) Ni...   25.02.2011, 14:23:39
- - Zyx   Jakie "dodatkowe parametry", kiedy nic z...   25.02.2011, 14:46:09
- - wookieb   Cytat(thek @ 25.02.2011, 13:39:36 ) W...   26.02.2011, 12:53:29
- - Crozin   Przecież napisałem, że w przypadku metod __get() i...   26.02.2011, 13:37:10
- - thek   Wookieb. Ja nie jestem anty-magic zatwardziały. Ni...   26.02.2011, 14:57:15


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

 



RSS Aktualny czas: 8.10.2025 - 18:50