Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] OOP wstrzykiwanie zależności
tadeurz
post
Post #1





Grupa: Zarejestrowani
Postów: 70
Pomógł: 1
Dołączył: 25.04.2009

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


Mam kontener do którego ładuję 2 moduły, z tych modułów chce mieć dostęp do konenera.
Macie na to jakiś lepszy sposób niż ten który stosuje:

  1. class container{
  2. private $lang;
  3. public $user;//moduł
  4. public $board;//moduł
  5. function __construct(){
  6. $this->user = new user($this);//w tym miejscu przekazuje obiekt do modułu, da się to zautomatyzować?
  7. $this->board = new board($this);
  8. }
  9. private function getLanguage(){
  10. return $lang;
  11. }
  12. }
  13. class user{
  14. private $parent;
  15. function __construct($parent){
  16. $this->parent = $parent;
  17. }
  18. function welcome(){
  19. echo $this->parent->getLanguage();
  20. }
  21. }
  22. class board{
  23. private $parent;
  24. function __construct($parent){
  25. $this->parent = $parent;
  26. }
  27. function welcomeOnBoard(){
  28. echo $this->parent->getLanguage();
  29. }
  30. }


Jeszcze uprzedzę: dziedziczenie kontenera dla każdego moduły z będzie nieintuicyjne.

Ten post edytował tadeurz 31.07.2013, 16:33:51
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Crozin
post
Post #2





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

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


1. Utwórz sobie interfejs na podstawie, którego będziesz mógł sprawdzić czy dany obiekt (User, Board) powinien mieć wstrzyknięty obiekt kontenera:
  1. interface ContainerAwareInterface {
  2. public function setContainer(Container $container); // oczywiście lepiej jest stosować type hinting po interfejsie, nie klasie
  3. public function getContainer();
  4. }
2. Zaimplementuj ten interfejs dla obu klas.
3. Teraz wstrzykiwanie zależności możesz sobie zautomatyzować:
  1. foreach ($objects as $object) {
  2. if ($object instanceof ContainerAwareInterface) {
  3. $object->setContainer($this);
  4. }
  5. }

Pozostaje jednak problem utworzenia kolekcji obiektów dla tej pętli z osobnych argumentów. Możesz:
1. Zamiast wstrzykiwać każdą zależność z osobna (co jest bardzo dobrą praktyką) wstrzyknąć jakąś tablicę tych zależności (co jest już nie tak dobrą praktyką).
2. Utworzyć sobie jakąś pomocniczą metodę robiącą to:
  1. class Container {
  2. ... __construct($a, $b, $c) {
  3. $this->injectMyself($a, $b, $c);
  4.  
  5. $this-> .. = $a;
  6. ...
  7. }
  8.  
  9. private function injectMyself() {
  10. foreach (func_get_args() as $object) {
  11. ....
  12. }
  13. }
  14. }
Ale to rozwiązanie też nie jest zbyt ładne. IMO najlepiej jednak ręcznie to zrobić - nie ma przy tym aż tak dużo pracy, a kod pozostaje bez "hacków".
Go to the top of the page
+Quote Post
tadeurz
post
Post #3





Grupa: Zarejestrowani
Postów: 70
Pomógł: 1
Dołączył: 25.04.2009

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


Wielkie dzięki. Po konsultacjach z znajomym otrzymałem taką samą odpowiedź jak Twoja, że tak jak teraz jest dobrze.

Dodałem tylko żeby zmienną przy konstruktorach modułów przekazywał przez referencje:
  1. class module{
  2. private parent;
  3. public function __construct(container &$parent){
  4. $this->$parent;
  5. }
  6. ...
  7. }


Ten post edytował tadeurz 31.07.2013, 16:32:12
Go to the top of the page
+Quote Post
Crozin
post
Post #4





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

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


Przekazywanie obiektów przez referencje jest bez sensu, powinno nawet wyrzucić jakieś błędy o ile dobrze pamiętam. Obiekty są z automatu przekazywane przez coś w rodzaju wskaźników, więcej oczywiście w Google: PHP object pass by reference

Ten post edytował Crozin 31.07.2013, 17:00:14
Go to the top of the page
+Quote Post
tadeurz
post
Post #5





Grupa: Zarejestrowani
Postów: 70
Pomógł: 1
Dołączył: 25.04.2009

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


Nie wiem czy jest sens pisać tak krótki post w którym muszę napisać: masz racje.

http://stackoverflow.com/questions/9331519...9332219#9332219

Ten & nie ma tam sensu.

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 04:01