Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Rejestr do oceny
Black-Berry
post
Post #1





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


*Plik Bootstrap* Każdemu obiektowi który ma mieć zakres globalny przekazujemy w konstruktorze context
  1. <?php
  2. $context = new Context();
  3.    $config = new Config($context);
  4.    $log = new Log($context);
  5.    $dbDriver = new Db_Driver($context);
  6.    $session = new Session($context);
  7.    $language = new Language($context);
  8.    $user = new User($context);
  9.    $structure = new Structure($context);
  10.    $router = new Router($context);
  11.    $buffer = new Buffer($context);
  12. ?>


Każdy obiekt globalny dziedziczy po klasie System_Object
  1. <?php
  2.    class System_Object
  3.    {
  4.        public $context = array();
  5.        
  6.        public function __construct(Context $context)
  7.        {
  8.            $this->context = $context->getRegistry();
  9.            $context->register($this);
  10.        }
  11.        
  12.        public function __get($key)
  13.        {
  14.            if(isset($this->context[$key])) {
  15.                return $this->context[$key];
  16.            }
  17.        }
  18.    }
  19. ?>


Obiekt Kontext
  1. <?php
  2.    class Context
  3.    {
  4.        private $registry = array();
  5.    
  6.        public function __get($key)
  7.        {
  8.            if(isset($this->registry[$key])) {
  9.                return $this->registry[$key];
  10.            }
  11.        }
  12.        
  13.        public function register(System_Object $object)
  14.        {
  15.            $key = System_Strings::variableNotation(get_class($object));
  16.            $this->registry[$key] = $object;
  17.        }
  18.        
  19.        public function getRegistry()
  20.        {
  21.            return $this->registry;
  22.        }
  23.    }
  24.    
  25. ?>


Przykłądowa klasa. Wszystkie inne na podobnej zasadzie. Nie ma żadnych setterów, getterów, wszystko bez zbędnych kodów.
  1. <?php
  2.    class Config extends System_Object
  3.    {
  4.        public $test = 'Wartość testowa';
  5.    
  6.        public function __construct(Context $context)
  7.        {
  8.            parent::__construct($context);
  9.        }
  10.    }  
  11. ?>


sposób użycia
  1. <?php
  2.    print $user->config->test;  // jak widac obiekt wyswietla zmienna z innego obiektu
  3.    $log->config->test = 'foo'; // a zupelnie inny obiekt modyfikuje ta wartosc
  4.    print $user->config->test; // no i wartosc ulega zmienie tak jakby byla globalna
  5. ?>


Moim zdaniem to musi być ostateczne rozwiązanie problemu globalsów. Bardzo proszę o dyskusję

Czy singletony zamiast tego byłyby wydajniejsze ? Podobno singletony to zło. Ja już zgupłem do reszty @_@

Ten post edytował Black-Berry 5.11.2008, 09:24:28
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
destroyerr
post
Post #2





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


empathon mylisz się. Type hinting właśnie służy do tego co opisałeś. Jeśli zdefiniujesz interfejs i w klasach będziesz go implementował to spokojnie to zadziała. Może jak zobaczysz kod to sobie przypomnisz bo na pewno o tym wiesz:
  1. <?php
  2. interface Request
  3. {
  4. }
  5.  
  6. class Context
  7. {
  8.    public function setRequest(Request $request)
  9.    {
  10.    }
  11. }
  12.  
  13. class WebRequest implements Request
  14. {
  15. }
  16.  
  17. class ConsoleRequest implements Request
  18. {
  19. }
  20.  
  21. $context = new Context();
  22. $context->setRequest(new WebRequest());
  23. $context->setRequest(new ConsoleRequest());
  24. ?>


Co do tematu to od siebie dodam, że warto zainteresować się wzorcem http://martinfowler.com/articles/injection.html W kontekście php najlepszą prezentacją jaką widziałem jest ta. A w niej 3 kluczowe linki do projektów:
http://phpcrafty.sourceforge.net/
http://garden.tigris.org
http://www.stubbles.net/wiki/Docs/IOC
Go to the top of the page
+Quote Post
Black-Berry
post
Post #3





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


Cytat(destroyerr @ 3.11.2008, 21:26:22 ) *
(..)Co do tematu to od siebie dodam, że warto zainteresować się wzorcem dependency injection (..)
Dzięki za linki. Trochę poczytałem i wydaje mi się że to co ja napisałem to właśnie ten wzorzec tylko całkowicie zautomatyzowany. Czy się nie mylę?


Cytat(pp-layouts @ 3.11.2008, 22:53:41 ) *
Ciekawi mnie, jakie moje rozwiązanie ma wady i dlaczego kurcze nikt takiego myku nie używa?
Myślę że temu, że to przeczy zasadom obiektowości. Poza tym większość ludzi używa singletonów na podobnej zasadzie a ponoć są szybsze niż klasy statyczne ale mogę się mylić.

Moje rozwiązanie różni się tym od Twojego, że (na podstawie tego co mi napisał empathon) jest o wiele szybsze w działaniu. A poza tym przy lekkiej modyfikacji możnaby do różnych klas dodawać różne konteksty. Myślę, że moje rozwiązanie nadaje się tylko dla leniwych ale ja jestem raczej leniwy więc mi leży.
Go to the top of the page
+Quote Post

Posty w temacie


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: 27.09.2025 - 02:43