2010-11-09 42 views
3

Dans mon bootstrap.php J'ai beaucoup de fonctions _initX(), et certains d'entre eux peuvent contenir du code qui dépend de code dans le précédent initxDo _initX() fonctions s'appelées dans l'ordre

protected function _initAutoloading() { } 
protected function _initViewInitializer() { } 
protected function _initVariables() { } 

Ma question , ces fonctions _init sont-elles garanties pour être exécutées dans l'ordre exact où elles ont été déclarées?

Répondre

4

EDIT - Pour fournir une réponse plus directe à votre question, je dirais qu'ils le seront probablement puisque le code utilise ReflectionObjects :: getmethods() ou get_class_methods en fonction de votre version de PHP, donc je crois que ceux-ci retourneront la fonction dans l'ordre mais il n'y a rien dans les documents PHP ou Zend qui garantissent que ce sera toujours le cas, donc je ne considérerais pas cela comme une fonction supportée.

Vous pouvez transmettre les noms des fonctions de ressources que vous voulez/devez appeler dans le cadre de l'appel bootstrap: $bootstrap->bootstrap(array('foo', 'bar')); au lieu de ne rien transmettre et laissez l'application Zend les appeler automatiquement dans lesquels vous n'êtes pas sûr de l'ordre . Si vous avez des dépendances entre vos ressources bootstrap, je vous suggère de regarder les plugins Resource qui vous permettront de séparer votre code dans différentes classes et d'appeler $ bootstrap ('foo') depuis votre ressource 'barre' plugin code (bien que vous puissiez le faire avec les fonctions _init *())

Un autre avantage des plugins de ressources est qu'ils peuvent être partagés avec d'autres fichiers bootstrap si vous en avez besoin et qu'ils sont plus faciles à tester que _init * () les fonctions.

Assurez-vous de lire theory of operation document de la Zend Application doc

+0

+1: c'est exactement correct (trouvé à la dure :)) –

1

Si vous avez vraiment besoin de les invoquer dans un ordre particulier, vous devez utiliser une liste d'aide:

var $init_us = array(
    "_initAutoloading", 
    "_initViewInitializer", 
    "_initVariables", 
); 

function __construct() { 
    foreach ($this->init_us as $fn) { 
     $this->{$fn}(); 
    } 
} 

Pour utiliser cette construction dans ZF, vous pouvez renommer l'exemple __construct dans _initOrderedList et votre commande _initFunctions dans _myinit... ou quelque chose.

+0

jblue, promettent-ils une exécution ordonnée dans le manuel? –

+0

Je dirais aussi que vous ne devriez pas compter dessus si ce n'est pas explicitement indiqué. – mario

1

Lire la manual. Il existe une section appelée Suivi des dépendances:

Si une ressource dépend d'une autre ressource, elle doit appeler bootstrap() dans son code pour s'assurer que la ressource a été exécutée. Les appels subséquents seront alors ignorés.

Voici un exemple de code:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initRequest() 
    { 
     // Ensure the front controller is initialized 
     $this->bootstrap('FrontController'); 

     // Retrieve the front controller from the bootstrap registry 
     $front = $this->getResource('FrontController'); 

     $request = new Zend_Controller_Request_Http(); 
     $request->setBaseUrl('/foo'); 
     $front->setRequest($request); 

     // Ensure the request is stored in the bootstrap registry 
     return $request; 
    } 
} 

Vous ne devez pas compter sur l'ordre.

+0

Je suis au courant de la solution de dépendance. J'essaie de minimiser le code en évitant les appels '$ this-> bootstap' et' $ this-> getResource' car chaque fois que j'ai besoin d'utiliser '$ front' comme dans votre exemple, je dois faire ces 2 appels . Ou n'est-ce pas? – jblue

+0

Quel est le problème? La vitesse ? Hey c'est Zend Framework! ;-) Non, sérieusement, c'est seulement trois ou quatre appels de méthode et deux recherche dans un tableau ... Pas un gros problème. – Maxence