2009-05-29 5 views
6

Ist es möglich, in PHP aus einem Konstruktor elegant zu beenden? Etwas auf die Wirkung vonIst es möglich, in einem Konstruktor elegant zu beenden?

class Foo { 

function __construct() 
{ 

    $active = false; 

    if(!$active) 
    { 
    return false; 
    } 

} 

} 

Ich versuche, dies zu tun, weil ich, wenn eine der Methoden in der Klasse zu sehen, überprüfen möchte läuft auf einer Konfigurationsdatei basiert sollte. Ich möchte nicht die Konfigurationsdatei in jeder Methode überprüfen müssen, um zu sehen, ob die Methoden ausgeführt werden sollten.

Antwort

7

Das hängt davon ab, was Sie mit "anmutig" meinen. Wenn Sie Ihren Konstruktor wollen scheitern Sie eine Ausnahme auslösen kann, oder können Sie die Fabrik Muster verwenden:

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

Vielleicht können Sie ein bisschen auf erarbeiten, was genau es ist, dass Sie erreichen möchten.

+1

ich aus einer anderen Datei diese Klasse nenne.Wenn ich $ active auf false setze, möchte ich, dass keine der Methoden ausgeführt wird und die andere Seite normal geladen wird. Zum Beispiel, wenn ich einen Würfel mache; im Konstrukt wird es für jede Seite sterben, die dieses Objekt aufgerufen hat. –

+0

In diesem Fall könnten Sie das Factory-Muster verwenden, um ein Dummy-Objekt zurückzugeben, wenn $ active falsch ist und das "echte" Objekt, wenn dies nicht der Fall ist. Dies ist nicht die eleganteste Lösung, aber es würde den Trick gut machen. – n3rd

0

Ich denke, N3rd schlug eine sehr coole Lösung vor, aber hier ist eine andere einfachere Methode.

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

Funktioniert nicht. Ich glaube nicht, dass es möglich ist, einen Wert im Konstrukt zurückzugeben. :/ –

+0

Es Dosis Arbeit. Wie Sie die Funktion wie aufrufen können, wenn ($ this-> überprüfen ($ aktiv)) {etwas tun} – Mantichora

1

Wenn Ihr Konstruktor fehlschlägt, sollten Sie eine Ausnahme auslösen und keinen falschen Wert zurückgeben. Es sei denn, Sie verwenden eine Sprache wie C, in der Ausnahmen in der Konstruktion des Objekts bedeutet, dass es nie dekonstruiert werden kann.

Der Grund dafür ist, weil eine Ausnahme zwingt das Programm, damit umzugehen, und es gibt Ihnen die schlechten Daten. Wenn Sie einen Wert zurückgeben, sagen Sie -1 oder was auch immer, kann das Programm ruhig weitermachen und das ignorieren, bis es später ein Problem verursacht. Durch das Auslösen einer Ausnahme wird verhindert, dass diese Silent-Bugs den Code eingeben. Sie wissen vielleicht, dass es false zurückgibt, wenn es nicht richtig aufgebaut wurde, aber Ihr Mitarbeiter könnte nicht gerne versuchen, ein Objekt zu verwenden, von dem er dachte, dass er es konstruiert hat, um herauszufinden, dass es wirklich ein boolescher Wert ist.

3

Lassen Sie es explodieren. Ein graziöser Fehler in einem Konstruktor gibt es nicht. Vielleicht im aufrufenden Code, aber nicht im Konstruktor. Wirf eine Ausnahme und handle entsprechend.

3

Ich kann das Proxy-Muster auf Ihrem Weg riechen. Was Sie versuchen den Konstruktor zu erreichen, ist nicht fail auf einem Objekt anmutig aber nicht erlaubt Methoden aufgerufen zu beruhen, auf rund $ aktiven Kriterium.

This könnte Sie in die richtige Richtung weisen. Oder vielleicht nicht (= >> Ich mag die Seite, die ich verlinkt habe, nicht ganz, aber es war die beste, die ich für PHP finden konnte). Geben Sie Proxy auch aus anderen Quellen. Grundsätzlich wird Ihr ProxyObject einen Verweis auf ein echtes Objekt haben, das Methoden ausführen wird. Ihr Client-Code wird Methoden auf dem ProxyObject aufrufen, als wäre es die echte Sache, und das ProxyObject würde entscheiden, ob es aktiv ist oder nicht, ob die Nachricht an die echte Sache weiterleiten oder nichts zurückgeben oder null wird Dummy-Werte. Hört sich gut an?

2

Wenn der Konstruktor so viel Logik macht, dann ist es nicht gut gestaltet. Lassen Sie es leer, übergeben Sie die Konfiguration über eine Setter-Methode und lassen Sie es dort fehlschlagen.

Es ist nicht OO-Programmierung:

$o = new myObject(); 
if (!is_object($o)) // then what??? 
Verwandte Themen