2010-12-13 6 views
2

Je suis étudiant ce code: http://www.w3style.co.uk/a-lightweight-and-flexible-front-controller-for-php-5Quand utiliser `public static function createInstance()` plutôt qu'un constructeur habituel pour instancier une classe?

L'auteur y utilise une fonction static pour instancier une classe. Je suis fondamentalement un débutant et je n'avais jamais vu ça. Pourquoi utiliser un instantiateur static plutôt que le constructeur habituel?

Voici le code:
index.php

<?php 
define("PAGE_DIR", dirname(__FILE__) . "/pages"); 
require_once "FrontController.php"; 
FrontController::createInstance()->dispatch(); 

FrontController.php

<?php 
class FrontController { 
    public static function createInstance() { 
    if (!defined("PAGE_DIR")) { 
     exit("Critical error: Cannot proceed without PAGE_DIR."); 
    } 
    $instance = new self(); 
    return $instance; 
    } 
    public function dispatch() {....} 

Répondre

6

Ceci est une solution de contournement pour PHP, car il est trop bête pour des trucs comme ça:

(new SomeClass())->doSomething(); 

Oneliners comme cela sont impossibles en PHP natif. Voilà pourquoi certaines personnes enveloppent l'instanciation de la classe dans une méthode statique pour permettre:

SomeClass::create()->doSomething(); 

Il aide à garder le champ propre, puisque vous n'avez pas besoin des variables supplémentaires. Il ressemblerait à ceci, sinon:

$instance = new SomeClass(); 
$instance->doSomething(); 
unset($instance); 

EDIT:-moi de citer Gordon ici (des commentaires). « appels statiques sont les mêmes que mettre une fonction dans le cadre mondial d'appel, il sera toujours avoir une dépendance sur la portée globale. " Vous devriez être conscient de ce fait, car cela rend votre code moins flexible.

+0

Donc, cela a été fait pour mettre en œuvre un modèle de singleton - il n'y a pas d'autre raison d'utiliser un tel créateur statique? – JDelage

+0

createInstance() est publique, non protégée et non privée, donc ce n'est pas vraiment un pattern Singleton. La méthode n'est pas le constructeur aussi. – vladv

+0

@JDelage, @vladv: Désolé, je l'ai mal interprété. J'ai corrigé ma réponse. – jwueller

2

Les situations les plus courantes sont celles où vous souhaitez créer une instance singleton ou utiliser un modèle d'usine.

+0

Le problème est que cela ne crée pas une instance singleton. J'ai fait la même erreur dans ma réponse. – jwueller

+0

@elusive - Ceci est une réponse à la question originale de l'OP de "Pourquoi utiliser un instanciant statique plutôt que le constructeur habituel?" Le fait que le code affiché dans la publication n'implémente pas de modèle de conception sensé, mais utilise une méthode stupide pour réduire deux lignes de code à un, reflète simplement mal sur l'auteur du code original. –

+0

Je suis totalement d'accord. Je voulais juste souligner que l'OP (évidemment) a mis à jour sa question. – jwueller

1

PHP autorise uniquement un constructeur, ce qui signifie que si vous voulez avoir plusieurs façons de construire un objet, la fonction statique mulliple est considérée comme une solution valide. Cependant, le simple fait d'avoir une fonction statique qui appelle le constructeur ne semble pas avoir beaucoup de sens. Par exemple, vous pouvez avoir un constructeur qui prend des paramètres pour chaque propriété de l'objet. Par exemple, vous pouvez avoir un constructeur qui prend des paramètres pour chaque propriété de l'objet. Et une fonction statique qui prend juste un id, et fait un appel de base de données pour récupérer toutes les propriétés pour récupérer l'objet. Cela signifie que vous ne devez pas avoir toutes les procédures de base de données dans votre code d'appel. La fonction statique prend la responsabilité.

Il est souvent suggéré de faire une classe Factory séparée pour ce faire, mais je ne pense pas que cela ait toujours du sens. Vous devriez lire sur le sujet avant de prendre une décision si cela a un sens pour vous.

Questions connexes