Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] OOP wstrzykiwanie zależności
Forum PHP.pl > Forum > PHP
tadeurz
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.
Crozin
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".
tadeurz
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. }
Crozin
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
tadeurz
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.

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.