Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Definiowanie metod
Forum PHP.pl > Forum > PHP > Object-oriented programming
Magan
Witam,

Czy istnieje jakiś sposób by móc dynamicznie nie ingerując w obiekt dodać mu metodę, z poza obiektu? Nie chodzi o zabawy z extends albo implement.
Pyton_000
nie

Powiedz co chciałbyś osiągnąć.
Magan
Znów wraca temat mojego frameworka z pseudo mvc z ochydną strukturą katalogów. Mniejsza. Chodzi o to by przy tworzeniu obiektu ($obiekt = new obiekt()wink.gif lub tuż po tym wstrzyknąć/dodać metodę (w której nawiasem mówiąc znajdować się będzie kod odpowiadający za callback do kontrolera), konkretniej chodzi o zdefiniowanie metody __call() dla tworzonej instancji obiektu bez względu na to czy metoda ta już istnieje czy nie.
Pyton_000
A nie możesz po prostu wymusić implementacji interfejsu w którym do konstruktora będziesz przekazywał obiekt kontrolera? Zowie się do Dependency Injection.
Magan
Ok, dzięki za odpowiedź. Ten sposób będzie chyba lepszy, da mi to taką możliwość, że będę mógł decydować z góry która klasa będzie mogła korzytać z kontrolera... Ale w ogóle to nie powinno być tak, że obiekty powinny być niezależne od siebie, jedynie spełniać swoje zadania?
Pyton_000
A w jaki sposób chcesz połączyć je wink.gif DI daje Ci taką możliwość, a na dodatek przydatne do testowania bo zamiast wstrzykiwać normalny obiekt możesz wpakować Mock'a
Crozin
@Pyton_000: Wymuszanie konkretnej implementacji konstruktora jest bardzo, bardzo złą praktyką. Raczej powinno się wymuszać istnieje jakiejś metody inicjalizującej niezwiązanej z konstruktorem. Ten powinien być dowolny dla każdej klasy.
@Magan: Opisz dokładniej co chcesz osiągnąć i dlaczego w taki dziwny sposób (wymuszający istnienie metody __call(), która już wskazuje na to, że coś jest zrypane w Twoich założeniach). Nie każdy jest też zaznajomiony z tematem "Twojego frameworka".
Magan
Chcę uzyskać dynamiczny system hooków (między innymi).

Kontroler zawiera metodę którą są załączane pozostałe klasy powiększające funkcjonalność (db layer, cache, config manager - to od ustawień w pliku np. do sql, zarządzanie userami itd.).

Instancje poszczególnych klas są tworzone i trzymane w zmiennej obiektu kontrolera (w tablicy). Metoda __call() jest tak napisana, by metody poszczególnych (pod)obiektów mogły imitować metody klasy kontrolera.

Np., jeśli chciało by się odwołać do metody obiektu "sql", do metody "query" należy wtedy albo odwołać się w sposób:
  1. $this->chilldClass['sql']->query("zapytanie");


lub też w następujący sposób:
  1. $this->sql_query("zapytanie");


Czyli: $this->[nazwa_obiektu]_[metoda_obiektu]($parametr)

Ponadto odnośnie systemu hooków, jeśli przed nazwą klasy [nazwa_obiektu] czy też przed nazwą metody samego kontrolera wpiszemy hooked_
Czyli
  1. $this->hooked_sql_query();
albo
  1. $this->hooked_[nazwa_metody_kontrolera]();

Zostaną wywołane modyfikatory hooku (o ile takowy dla danej metody istnieje) w zależności czy ma być przed czy po metodzie (prefiksy _after i _before w nazwach meted hooka, bo hooki to obiekty zawierające grupy metod - rozszerzeń poszczególnych metod. Przyjmują i zwracają parametry hookowanej metody).

To, co chcę osiągnąć to możliwość callbacku wywołanej metody obiektu-"dziecka" do kontrolera (bo poprzez kontroler są wywoływane metody i kontrolera i pozostałych obiektów).
Np. Chciałbym by obiekt sql mógł swobodnie odwoływać się do obiektu np. cache lub obiekt user do obiektu sql.

Ale by tak było można muszę albo używać funkcji call_user_func_array (piszę z głowy, nie irytować się jeśli źle napisałem nazwę funkcji), albo wpisywać "global $main" (main, nazwa kontrolera) by podobiekt-dziecko miał dostęp do kontrolera czyli był możliwy callback umożliwiający tak jak już zobrazowałem dostęp np. obiektu "user" do obiektu "sql" poprzez kontroler.

To co chcę uzyskać to jakiś zautomatyzowany sposób by nie musieć się martwić czy obiekt-dziecko ma dostęp do callbacku, w przeciwnym razie każdy obiekt musi zawierać albo metodę __call() umożliwiającą callback np. $this->main_[metoda_kontrolera]() z poziomu metody obiektu dziecka...
Crozin
1. Kontroler to zwyczajny obiekt/klasa jak każda inna. Jeżeli ma jakieś zależności, powinny zostać jej one przekazane z zewnątrz - od biedy, można udostępnić jakiś rejestr wszystkich usług. Odwoływać się powinieneś przez najzwyklejsze właściwości.
2. Jakiekolwiek kombinowanie z nazwami metod, które miałby wprowadzać jakieś "magiczne" zachowanie z góry oznacza, że sam pomysł jest skopany i nic dobrego z niego raczej nie wyjdzie.
3. Prawdopodobnie powinieneś zapoznać się z zagadnieniem zdarzeń (Google: PHP event dispatcher) czy obserwatora (Google: PHP observer pattern).
Magan
Dziękuję za rzetelną odpowiedź. Zapoznam się z wymienionymi zagadnieniami
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.