2010-08-12 8 views
4

J'ai un arrière-plan Java. Restez avec moi.Initialisation unique pour l'application

Dans une application Java, une méthode d'initialisation unique consiste à utiliser une "servlet d'initialisation" dont la méthode init() peut avoir un code d'initialisation unique. Un autre mécanisme plus général est d'avoir un Singleton qui s'initialise lors de la première utilisation - et ce mécanisme fonctionnera dans plusieurs langages/plates-formes. Ce que je dois savoir, c'est comment le faire pour ma webapp PHP.

Devrais-je utiliser le motif Singleton? Y a-t-il une autre façon spécifique/meilleure/PHP? Essentiellement je veux avoir un "Registre" - une seule instance de celui-ci - que je peux ensuite utiliser pour créer des instances d'autres objets (eux-mêmes Singleton ou non dépend de la situation à portée de main). Le but ultime est - J'ai besoin de certaines choses initialisées AVANT qu'une requête web ne soit servie par mon application web PHP - quelque chose qu'un "Initializer Servlet" en Java me garantit. Peut-être qu'il existe une "page PHP Initializer" ou quelque chose comme ça?

Merci à l'avance

Répondre

0

La source PHP, dans le sens normal, ne génère pas un programme exécutable. C'est un langage de script. Cependant, vous êtes capable de créer un singleton.

0

La nature de PHP ne vous permettra pas d'avoir une initialisation comme les servlets. En PHP tout sera dans une requête web. Comme vous l'avez mentionné, le Registry design pattern peut vous aider à avoir une place pour mettre vos objets, cependant, ils seront recréés à chaque demande.

+0

Euh, maintenant je suis un peu confus. Êtes-vous en train de dire que même le modèle Singleton ne fonctionnera pas pour mon registre? Êtes-vous en train de dire que la "portée" du singleton est restreinte au thread de contrôle traitant ma requête web. Si tel est le cas, je ne suis pas sûr de la manière dont les divers frameworks PHP réalisent l'injection de dépendances, à moins bien sûr que l'ensemble de la hiérarchie des objets soit construit sur chaque requête web. Je veux utiliser PHP mais ce serait un briseur d'affaire pour moi et j'espère que j'interprète mal vos commentaires. – Arby

+0

Habituellement, l'ensemble de la hiérarchie d'objets est construit à chaque requête. La façon dont cela est fait dans le projet CakePHP est assez facile à suivre, peut-être que cela donnera un aperçu. – sleepynate

+0

A moins que quelque chose n'ait changé au cours des dernières années (environ 3 ans sans travailler avec php), je peux vous dire ceci: la hiérarchie entière des objets sera utilisée pour chaque requête. – Fernando

0

Je n'ai pas d'arrière-plan Java, mais un singleton qui, lors de la construction, initie et renvoie (ou reste statique) d'autres singletons/usines est un modèle commun. Parce que le seul "point d'entrée" défini d'une application PHP est le fichier qui est passé à l'analyseur, de nombreuses applications PHP se chargent de rediriger vers un script "bootstrap" qui prépare l'environnement et instancie les objets statiques et singleton nécessaires par l'application. Ceci est ensuite inclus au point d'entrée pour assurer qu'il est disponible pour l'ensemble de l'application.

<?php // this file is bootstrap.php 
// ... 
class MySingleton { 
    private static $instance; 

    private function __construct() { 
     $this->myFactory1 = new MyFactory1(); 
     $this->myFactory2 = new MyFactory2(); 
     $this->myOtherSingleton = MyOtherSingleton::get(); 
    } 

    public static function get() { 
     if (!isset(self::$instance)) { 
      $c = __CLASS__; 
      self::$instance = new $c; 
     } 
     return self::$instance; 
    } 

    public function __clone() { 
     trigger_error('Clone is not allowed.', E_USER_ERROR); 
    } 
} 

// Before we leave, we'll get an instance! 
$myBootstrapUtility = MySingleton::get(); 
// end of bootstrap.php ?> 

un alors assurez-vous de require_once('bootstrap.php'); avant que le reste de la logique de l'application.

Bien sûr, les détails sont entièrement à vous, mais ce n'est certainement pas une façon inhabituelle de faire ce que vous recherchez.

+0

A-ha! Merci beaucoup pour votre réponse. Juste une question. Si j'utilise require_once ('bootstrap.php') cela fonctionne différemment de include ('bootstrap.php') ACROSS tous mes scripts PHP? Si la réponse est oui, alors cela signifierait la première fois que tout utilisateur de mon site Web a frappé l'index.php, mon Singleton serait initialisé et plus jamais. Quoiqu'il en soit, si une réponse définitive n'existe pas à ma question (vous avez dit que les gens vont très loin mais n'ont pas mentionné ces longueurs) alors je ne sais pas comment divers frameworks comme Zend, Symfony, etc prétendent faire "DI Once" . – Arby

+0

Habituellement, s'il s'agit d'une application web, s'assurer du point d'entrée est obtenu avec quelque chose comme '.htaccess'. 'require_once' assure que le bootstrap approprié est chargé et chargé une seule fois, de sorte que les autres inclusions du même fichier ne remplacent pas et ne réinstallent pas vos objets. Les deux méthodes sont acceptables, mais la méthodologie commune tend vers '.htaccess'. Une réponse définitive n'existe peut-être pas, car c'est une langue différente avec une idéologie différente, mais c'est l'une des façons dont quelque chose de similaire est réalisé (ce qui est bien au-delà des objectifs initiaux de PHP). – sleepynate

+0

Consultez http://book.cakephp.org/view/21/A-Typical-CakePHP-Request, http://github.com/cakephp/cakephp/blob/master/cake/bootstrap.php, et l'endroit où ils traitent effectivement l'envoi de l'utilisateur au bon endroit après tout le bâtiment de la hiérarchie de l'objet ... le légèrement plus massif http://github.com/cakephp/cakephp/blob/master/cake/dispatcher.php (Notant l'utilisation du registre des applications) – sleepynate