2009-05-29 5 views
6

Est-il possible de quitter gracieusement un constructeur en php? Quelque chose à l'effet deEst-il possible de quitter gracieusement dans un constructeur?

class Foo { 

function __construct() 
{ 

    $active = false; 

    if(!$active) 
    { 
    return false; 
    } 

} 

} 

Je suis en train d'y arriver parce que je veux vérifier si l'une des méthodes de la classe devrait fonctionner sur la base d'un fichier de configuration. Je ne veux pas avoir à vérifier le fichier de configuration dans chaque méthode pour voir si les méthodes devraient être en cours d'exécution.

Répondre

7

Cela dépend de ce que vous entendez par "gracieusement". Si vous voulez que votre constructeur pour vous échouez pouvez lancer une exception, ou vous pouvez utiliser le modèle d'usine:

class FooFactory { 
    function makeFoo() { 
     return $someConstraint ? null : new Foo(); 
    } 
} 

Peut-être que vous pouvez élaborer un peu sur ce qu'est exactement ce que vous voulez accomplir.

+1

J'appelle cette classe d'un autre fichier.Si je mets $ active à false, je voudrais qu'aucune des méthodes ne s'exécute, et que l'autre page se charge normalement. Par exemple, si je mets un dé; dans la construction, il mourra pour chaque page qui a appelé cet objet. –

+0

Dans ce cas, vous pouvez utiliser le motif d'usine pour renvoyer un objet factice si $ active est false et l'objet "real" s'il ne l'est pas. Ce n'est pas la solution la plus élégante mais elle ferait bien l'affaire. – n3rd

0

Je pense que N3rd a suggéré une solution très cool mais voici une autre méthode plus simple.

class Foo { 

    private $active = TRUE; 

    function __construct() { 

     $this->check ($active); 

      //OR 
      //if ($this->check ($active)) { do something } 
    } 

    function check($var) { 
     if (! $var) { 
      $this->active = FALSE; 
      return FALSE; 
     } 
     return TRUE; 

    } 
} 
+0

Ne fonctionne pas. Je ne pense pas qu'il soit possible de retourner une valeur dans la construction. :/ –

+0

Il dose travail. Comme vous pouvez appeler la fonction comme if ($ this-> cocher ($ active)) {faire quelque chose} – Mantichora

1

Si votre constructeur échoue, vous devriez lancer une exception, ne pas retourner une valeur fausse. Sauf si vous utilisez un langage comme C dans lequel les exceptions dans la construction de l'objet signifie qu'il ne peut jamais être déconstruit. La raison de ceci est qu'une exception force le programme à s'en occuper et vous donne les mauvaises données. Si vous renvoyez une valeur, dites -1 ou quoi que ce soit, le programme peut continuer en mode silencieux et l'ignorer jusqu'à ce qu'il cause un problème plus tard. Le lancement d'une exception empêche ces bogues silencieux d'entrer le code. Vous savez peut-être qu'il renvoie false s'il ne réussit pas à construire correctement, mais votre collègue ne peut pas et peut heureusement essayer d'utiliser un objet qu'il pensait être ce qu'il avait construit pour découvrir que c'était vraiment un booléen.

3

Faites-le exploser. Il n'y a pas de défaillance gracieuse dans un constructeur. Peut-être dans le code appelant, mais pas dans le constructeur. Lancez une exception et gérez-la de manière appropriée.

3

Je peux sentir le modèle Proxy venir à votre rencontre. Ce que vous essayez d'atteindre n'est pas ayant le constructeur échouer gracieusement mais ne permettant pas d'appeler des méthodes sur un objet basé sur un certain critère $ actif.

This peut vous orienter dans la bonne direction. Ou peut-être pas (= >> je n'aime pas vraiment la page que j'ai liée, mais c'était le meilleur que j'ai pu trouver pour PHP). Donnez une lecture Proxy, d'autres sources peut-être aussi. Fondamentalement, votre ProxyObject aura une référence à un objet réel qui exécutera les méthodes. Votre code client appellera des méthodes sur le ProxyObject comme s'il s'agissait du real thing, et le ProxyObject déciderait s'il est actif ou non, s'il faut passer le message sur le ou renvoyer rien ou null ou valeurs factices. Ça m'a l'air bien?

2

Si le constructeur fait tellement de logique, alors il n'est pas bien conçu. Laissez-le vide, transmettez-lui la configuration via une méthode setter et laissez-la tomber en panne.

Il n'est pas la programmation OO:

$o = new myObject(); 
if (!is_object($o)) // then what??? 
Questions connexes