Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Definiowanie metod
Magan
post
Post #1





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 3.06.2009

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


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.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


nie

Powiedz co chciałbyś osiągnąć.
Go to the top of the page
+Quote Post
Magan
post
Post #3





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 3.06.2009

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


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.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


A nie możesz po prostu wymusić implementacji interfejsu w którym do konstruktora będziesz przekazywał obiekt kontrolera? Zowie się do Dependency Injection.
Go to the top of the page
+Quote Post
Magan
post
Post #5





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 3.06.2009

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


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?
Go to the top of the page
+Quote Post
Pyton_000
post
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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
Go to the top of the page
+Quote Post
Crozin
post
Post #7





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

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


@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".

Ten post edytował Crozin 20.09.2014, 23:59:42
Go to the top of the page
+Quote Post
Magan
post
Post #8





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 3.06.2009

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


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

Ten post edytował Magan 23.09.2014, 05:44:35
Go to the top of the page
+Quote Post
Crozin
post
Post #9





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

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


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).
Go to the top of the page
+Quote Post
Magan
post
Post #10





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 3.06.2009

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


Dziękuję za rzetelną odpowiedź. Zapoznam się z wymienionymi zagadnieniami
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 Aktualny czas: 21.08.2025 - 23:59