Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] bootstrap i unset($front ... itd. )
Forum PHP.pl > Forum > PHP > Frameworki
jarek_bolo
Witam

Czytam sobie właśnie quickstart'a o ZF i nie rozumiem jednej rzeczy.
Chodzi o index.php i bootstrap.php

Aby lepiej wytłumaczyć o co chodzi wkleję kod index.php i w miejscu includowania boostrapa, od razu też wkleję jego kod. Wyciąłem komentarze co by krócej było.

  1. <?php
  2. define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application/'));
  3. set_include_path(APPLICATION_PATH . '/../library' . PATH_SEPARATOR . get_include_path());
  4.  
  5. require_once "Zend/Loader.php";
  6. Zend_Loader::registerAutoload();
  7.  
  8. try {
  9.    // require '../application/bootstrap.php'; kod bootstrapa wklejam poniżej
  10.    // ##############################################
  11. defined('APPLICATION_PATH')
  12.    or define('APPLICATION_PATH', dirname(__FILE__));
  13.  
  14. defined('APPLICATION_ENVIRONMENT')
  15.    or define('APPLICATION_ENVIRONMENT', 'development');
  16.  
  17. $frontController = Zend_Controller_Front::getInstance();
  18. $frontController->setControllerDirectory(APPLICATION_PATH . '/controllers');
  19. $frontController->setParam('env', APPLICATION_ENVIRONMENT);
  20.  
  21. Zend_Layout::startMvc(APPLICATION_PATH . '/layouts/scripts');
  22.  
  23. $view = Zend_Layout::getMvcInstance()->getView();
  24. $view->doctype('XHTML1_STRICT');
  25.  
  26. $configuration = new Zend_Config_Ini(APPLICATION_PATH . '/config/app.ini', APPLICATION_ENVIRONMENT);
  27.  
  28. $dbAdapter = Zend_Db::factory($configuration->database);
  29.  
  30. Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter);
  31.  
  32. $registry = Zend_Registry::getInstance();
  33. $registry->configuration = $configuration;
  34. $registry->dbAdapter     = $dbAdapter;
  35.  
  36. unset($frontController, $view, $configuration, $dbAdapter, $registry);
  37.  
  38.    // ##############################################
  39.  
  40. } catch (Exception $exception) {
  41.    echo '<html><body><center>'
  42.       . 'An exception occured while bootstrapping the application.';
  43.    if (defined('APPLICATION_ENVIRONMENT') && APPLICATION_ENVIRONMENT != 'production') {
  44.        echo '<br /><br />' . $exception->getMessage() . '<br />'
  45.           . '<div align="left">Stack Trace:'
  46.           . '<pre>' . $exception->getTraceAsString() . '</pre></div>';
  47.    }
  48.    echo '</center></body></html>';
  49.    exit(1);
  50. }
  51.  
  52. Zend_Controller_Front::getInstance()->dispatch();
  53. ?>


W lini 18 tworzymy pierwszy raz Front Controller, robimy na nim dwa ustawienia, katalogu i zmiennej.
Następnie w linii 24 tworzymy obiekt View, też robimy jakieś ustawienia.
Tworzone są jeszcze obiekty konfiguracji i uchwyt do bazy danych.

[pisząc ten tekst powoli zaczynam chyba sam rozumieć, ale kontynuuję dalej co by dostać odpowiedź potwierdzającą czy dobrze rozumiem no i może dla potomnych się przyda]

I teraz obiekty konfiguracji i uchwyt do bazy są dodawane do Rejestru, ale FrontControler oraz View do rejestru dodane nie są, a mimo wszystko też są niszczone :/
Trochę byłem zmieszany tym, ale zacząłem szperać po API no i wymysliłem, że powód dla którego można skasować te obiekty jest taki, że zostały one utworzone na podstawie klas statycznych (Front na pewno).

I teraz czy dobrze sobie to tlumacze, ze z chwila zapoczątkowania przejścia przez aplikację (wchodzimy do index, itd., uruchmiamy parser php i adresowanie pamięci na podstawie kodu) odwołania do klas statycznych przy pomocy "::", bądź za pomocą singeltonowego obiektu takiej klasy i wykonywanie metod, ustawianie właściwości powodują zapisanie tych danych na poziomie klasy, która to ma przydzieloną swoją fizyczną pamięć?

No bo z obiektami normalnych klas, wiadomo, każdy obiekt to inna komórka pamięci. Dobrze to mniej więcej rozumuję questionmark.gif To są pewnie podstawy obiektówki tiredsmiley.gif
dr_bonzo
Jak masz obiekty to pamiec jest dzielona na 2 obszary (sterte i stos).
Na stercie sa obiekty, a na stosie zmienne wskazujace na te obiekty. Kiedy ZADNA zmienna nie wskazuje na dany obiekt to jest on usuwany (w uproszczeniu!).

  1. <?php
  2. //...
  3. $x = new X();
  4. $c->setX( $x ); // a w srodku $this->x = $x
  5. unset($x); // usunales zmienna wskazujaca na obiekt klasy X, ale obiekt jeszcze istnieje bo jest trzymany przez obiekt $c
  6. ?>



No i w tym przypadku FronController i View sa trzymane takze w singletonach (czyli zapisane w klasie == nie znikna dopoki ich sam stamtad nie usuniesz) - pamietasz jak on wyglada (self::$instance = $view/$frontCon..... itp ) - wiec unset nie zniszczy tych obiektow.
jarek_bolo
Dzięki Dr_Bonzo za wyklarowanie sposobu jak to działa.
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.