Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> __call i dynamiczne metody
Endzio
post
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
 
Start new topic
Odpowiedzi
Endzio
post
Post #2





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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif)

Ten post edytował Endzio 17.01.2010, 18:33:44
Go to the top of the page
+Quote Post

Posty w temacie


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: 15.10.2025 - 15:48