Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][OOP]Pomysł na system pluginów, obiekty w obiektach, Obiekt w obiekcie, obiekt pogania
Sky_walker
post
Post #1





Grupa: Zarejestrowani
Postów: 214
Pomógł: 23
Dołączył: 26.09.2005

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


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ć?


--------------------
Pomogłem? Kliknij poniżej.
Dzięki! :D
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
Mephistofeles
post
Post #2





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


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





Grupa: Zarejestrowani
Postów: 214
Pomógł: 23
Dołączył: 26.09.2005

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


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

Ten post edytował Sky_walker 18.11.2010, 15:16:00


--------------------
Pomogłem? Kliknij poniżej.
Dzięki! :D
Go to the top of the page
+Quote Post
Mephistofeles
post
Post #4





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


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





Grupa: Zarejestrowani
Postów: 214
Pomógł: 23
Dołączył: 26.09.2005

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


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?


--------------------
Pomogłem? Kliknij poniżej.
Dzięki! :D
Go to the top of the page
+Quote Post
phpion
post
Post #6





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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();
Go to the top of the page
+Quote Post
Sky_walker
post
Post #7





Grupa: Zarejestrowani
Postów: 214
Pomógł: 23
Dołączył: 26.09.2005

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


Oooooo...... GENIALNE biggrin.gif
Wielkie dzięki!


--------------------
Pomogłem? Kliknij poniżej.
Dzięki! :D
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: 19.08.2025 - 15:45