Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> __call i dynamiczne metody
Endzio
post 16.01.2010, 21:21:57
Post #1





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 10.09.2007

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


Witam.
Jestem w trakcie pisania klasy do wywoływania pluginów, wpadłem na ciekawy pomysł (pewnie nie tylko ja), aby odwoływać się do nich przez metody.

Dla przykładu, plugin panel_bbcode, który wyświetla ikony do wprowadzania tagów BBCode:
  1. $plug = new Plugin();
  2. echo $plug->panel_bbcode();

  1. class Plugin
  2. {
  3. function __call($plugin, $arguments)
  4. {
  5. // Tutaj powinno być include, lub file_get_contents zamiast linijki poniżej
  6. $this->{$plugin} = function ($x, $y, $z) {return 'Plugin '.$plugin.' został wywołany';};
  7.  
  8. // Tutaj powinno być definiowanie metody
  9.  
  10. return call_user_func_array(array($this, $plugin), $arguments);
  11. }
  12. }


Sposób ten (podobno) działa w PHP 5.3, ale używam wersji 5.2
Czy można takie coś zrobić w PHP 5.2?

Ten post edytował Endzio 16.01.2010, 22:03:57
Go to the top of the page
+Quote Post
Crozin
post 17.01.2010, 12:54:25
Post #2





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

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


1) Sam pomysł nie wydaje mi się dobry... zawsze cały plugin wpakujesz do jednej metody? IMO dużo lepiej byłoby dla każdego utworzyć osobną klasę, która dziedziczyła by po jakiejś innej (abstrakcyjnej) dającej jakieś tam podstawowe narzędzia wspólne w obrębie wszystkich pluginów.
2) W PHP przed 5.3, nie zadziała Ci linijka: $this->{$plugin}..., ponieważ nie ma obsługi funkcji anonimowych. Ale mógłbyś to chyba ominąć przez create_function (nie jestem jednak pewien czy uda się utworzyć w ten sposób metodę dla obiektu - raczej nie.

W każdym bądź razie, źle kombinujesz...
Go to the top of the page
+Quote Post
Endzio
post 17.01.2010, 16:01:42
Post #3





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 10.09.2007

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


Cytat(Crozin @ 17.01.2010, 12:54:25 ) *
W każdym bądź razie, źle kombinujesz...

Lubię prostotę w kodzie.

Podoba mi się takie rozwiązanie.
W obojętnie jakim miejscu wprowadzam
  1. $plug->panel(...)
i jeśli istnieje taki plugin to "includuje" go (jeśli wcześniej metoda nie została utworzona), rejestruje metodę i wyświetla zawartość, a jeśli nie istnieje to zwraca false.

// Edytka
Po przemyśleniu doszedłem do wniosku, że masz rację, pluginy mogą być klasami, do których bym się odwoływał podobnie:
  1. $plug->panel->show();

a funkcja __call by wyglądała tak:
  1. class Plugin
  2. {
  3. function __call($plugin, $arguments)
  4. {
  5. // Tutaj include lub instrukcja warunkowa
  6. return $this->{$plugin} = new $plugin;
  7. }
  8. }



// Edytka 2
Jednak w ten sposób nie działa.
Aby zadziałało należy wpisać:
  1. $plug->panel();
  2. echo $plug->panel->show();

Przy wywołaniu $plug->panel->show() PHP nie korzysta z metody __call dry.gif
Czy istnieje możliwość pominięcia pierwszej linijki?


// Edytka 3
  1. echo $plug->panel()->show();

Zadziałało, ale w przypadku, gdy plugin nie istnieje PHP wyrzuca błąd
Cytat
Fatal error: Call to a member function show() on a non-object

Sugestie mile widziane smile.gif

Ten post edytował Endzio 17.01.2010, 18:33:44
Go to the top of the page
+Quote Post
bigZbig
post 20.01.2010, 09:13:51
Post #4





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


W metodzie __call sprawdzaj najpierw czy istnieje klasa o danej nazwie, a jeśli nie istnieje przypisz do danej zmiennej obiekt klasy, która też będzie miała metodę __call z tym, że ta metoda będzie zwracała np. wyjątek albo pustego stringa - w zależności od potrzeb.

Jeśli z kolei interesuje Cie uniwersalne rozwiązanie tego typu zagadnień to proponuje zapoznać się najpierw z:
DTO – wprowadzenie i charakterystyka
a potem
DTO – zastosowanie – Konfiguracja


--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.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.06.2024 - 01:49