Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][OOP]Pomysł na system pluginów, obiekty w obiektach
Forum PHP.pl > Forum > PHP > Object-oriented programming
Sky_walker
Witam,

Aktualny próbuję zrobić własny system pluginów i przeglądając różne wątki na ten temat wpadłem na następujący pomysł:
Zrealizowanie systemu pluginów na podstawie obiektów które w miarę potrzeb będą wczytywały inne obiekty. (trochę pokrętny opis, ale czytając dalej może zrobi się jaśniej)

Głównym celem tego pomysłu jest zwiększenie czytelności kodu, a więc i ułatwienie sobie życia smile.gif A przy okazji dodanie możliwości rozszerzania pluginów o nowe funkcjonalności zależnie od tego nad czym chcę pracować w danym pliku.

Programista mógłby się odwoływać do takiego pluginu w następujący sposób:

  1. $Plugin->Jablko->Wlasciwosc("kolor");

Albo:
  1. $Plugin->Wczytaj("Gruszka");
  2. $Plugin->Gruszka->Ustaw("dojrzała");
  3. $Plugin->Gruszka->Wczytaj("Robal");
  4. $Plugin->Gruszka->Robal->Zryj(true);

W związku z tym mam pytanie:
Jak odwołać się do zmiennych wewnątrz obiektu $Plugin z poziomu obiektu Gruszka. Przydałoby się śledzenie różnych statusów z poziomu obiektu pilnującego wszystkich zainstalowanych pluginów a to jedyna metoda jaka przychodzi mi na myśl, tylko nie wiem czy to jest wykonalne. Ewentualnie jakieś inne pomysły jak to zrealizować?
Mephistofeles
Bardzo mi się spodobał system bundle'i w nowym Symfony 2, możesz zobaczyć tutaj.
Korzysta on z wzorca Dependence Injection, a zarejestrowany bundle wykorzystuje się tak:
  1. jakiś kontroler
  2. $this->container['mailer']; // zwraca instancję Swift Mailera

a konfiguruje tak:
Kod
config.yml
swift.mailer:
    transport: gmail
    username:  your_gmail_username
    password:  your_gmail_password
Sky_walker
yhy.... tylko obawiam się, że to mi niewiele pomaga sad.gif
Chciałbym rozwiązać swój mały problem, a nie uczyć się nowego frameworka smile.gif winksmiley.jpg
Mephistofeles
Przecież nie mówiłem, żebyś wykorzystał Symfony, tylko żebyś zobaczył jak to tam jest zrobione, bo system jest megaelastyczny i właściwie cały framework jest zbudowany z takich bundli.
Sky_walker
Ok, przejrzałem kod Bundli... o ile dobrze to rozumiem, oni w każdej metodzie przerzucają Container i na nim robią operacje. Tylko to jest to czego właśnie chciałem uniknąć. Wtedy nie mógłbym zrobić swojego odwołania Gruszka->Robal->Metoda(""); winksmiley.jpg Właściwie to nie wiem nawet jakby odwoływać się do metody wewnątrz obiektu gruszka przekazując do niej tą gruszkę. blinksmiley.gif

Odwołania takie jak dałem za przykład rzeczywiście są w Symfony ale to bardziej polega na odwoływaniu się obiektu do samego siebie, kilka razy, np.
  1. class Test {
  2. public function Metoda1() {
  3. //operacje
  4. return $this;
  5. }
  6. }
  7. //i pozniej mozna robic
  8. $test = new Test;
  9. $test->Metoda1->metoda2->metoda3("aaa"); //gdzie każda metoda ma return $this;

Tylko akurat nie o to mi chodziło :/

Jedyny pomysł jaki mam to np.
  1. $Plugin->UstawStan("Robal");

gdzie UstawStan odwołuje się do metody w obiekcie Robal która zwraca tablicę stanów. Dość mało praktyczne, ale po części obchodziłoby problem z odwoływaniem się do obiektu który przetrzymuje mój obiekt. Tylko wtedy jest jeden duży problem - Metoda Zryj nie ma jak wywołać UstawStan - trzeba by to robić ręcznie po jej wywołaniu sad.gif

Więc zostają dwa pytania:
- Czy da się zmienić wartość w obiekcie zawierającym obiekt wewnętrzny z jego poziomu?
- Albo: Czy obiekt wewnętrzny może wywołać metodę z obiektu który go zawiera?
phpion
Cytat(Sky_walker @ 19.11.2010, 10:38:48 ) *
Więc zostają dwa pytania:
- Czy da się zmienić wartość w obiekcie zawierającym obiekt wewnętrzny z jego poziomu?
- Albo: Czy obiekt wewnętrzny może wywołać metodę z obiektu który go zawiera?

Da się, ale w obiekcie wewnętrznym musisz mieć referencję do obiektu zewnętrznego, czyli coś na zasadzie:
  1. <?php
  2. class XParent {
  3. private $childs = array();
  4.  
  5. public function add_child($child) {
  6. $child->set_parent($this);
  7.  
  8. $this->childs[] = $child;
  9. }
  10.  
  11. public function call_me() {
  12. return 'aaa';
  13. }
  14. }
  15.  
  16. class XChild {
  17. private $parent;
  18.  
  19. public function call_parent() {
  20. return $this->parent->call_me();
  21. }
  22.  
  23. public function set_parent($parent) {
  24. $this->parent = $parent;
  25. }
  26. }
  27.  
  28. $parent = new XParent();
  29. $child = new XChild();
  30.  
  31. $parent->add_child($child);
  32.  
  33. echo $child->call_parent();
Sky_walker
Oooooo...... GENIALNE biggrin.gif
Wielkie dzięki!
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.