![]() |
![]() ![]() |
![]() |
![]()
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. |
|
|
![]()
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ąć. |
|
|
![]()
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()
![]() |
|
|
![]()
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.
|
|
|
![]()
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?
|
|
|
![]()
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
![]() |
|
|
![]()
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 |
|
|
![]()
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:
lub też w następujący sposób:
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 albo
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 |
|
|
![]()
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). |
|
|
![]()
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
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 23:59 |