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
l0ud
post
Post #2





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

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


Black-Berry, nie wiem czy do końca zrozumiałem Twój kod, ale imho trochę go przekombinowałeś. Jeżeli coś palnąłem, to mnie popraw (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)


  1. <?php
  2. $registry = $context->getRegistry();
  3.           while ($object = current($registry)) {
  4.               $this->context[key($registry)] = $object;
  5.               next($registry);
  6.           }
  7. ?>


Czyli z obiektu $context pobierasz listę elementów i w pętli (no właśnie - po co w pętli? Zwykłe przypisanie nie zadziała?) ładujesz wszystkie obiekty do tablicy $this->context, do której upraszczasz sobie później dostęp przez gettera. A co jeżeli po tym obiekcie, doda się następny? Nie będziesz miał do niego dostępu - lista elementów będzie już stara.
Poza tym, dostęp do obiektów nie powinien być taki prosty. W ten sposób mieszasz elementy klasy z globalnymi. Poza tym pozwalasz na takie cuda:
  1. <?php
  2. $buffer->router->structure->user->language->session->dbDriver...
  3. ?>


Co ma obiekt $buffer, do bazy danych? (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)


Ja u siebie robię to tak: mam jeden główny obiekt $ffCore który zajmuje się wczytywaniem innych i 'komunikacją' między nimi.

Początek przykładowej klasy wygląda tak:
  1. <?php
  2. class config implements createdByCore {
  3.    
  4.    private $db;
  5.    private $configArray = array();
  6.    
  7.    public function __construct(ffCore $ffCore) {
  8.        $this->db = $ffCore->database;
  9.        $this->loadConfig();
  10.    }
  11. ?>


Utworzenie jej obiektu:
  1. <?php
  2. $config = $ffCore->config;
  3. ?>

Główny kontroler sprawdza, czy zawiera już instancję obiektu o takiej nazwie. Jeżeli nie, tworzy ją.

W przy tworzeniu, '$ffCore' przekazuje swoją instancję w konstruktorze i umożliwia mu stworzenie aliasów do innych obiektów, które będą potrzebne. A jeżeli jakiś obiekt pojawi się później, zawsze mogę utworzyć alias do samego $ffCore, czego jednak staram się unikać.
Go to the top of the page
+Quote Post

Posty w temacie


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: 15.10.2025 - 19:08