2016-05-23 7 views
1

Kann ich einer Eigenschaft einen Wert im Konstruktor zuweisen, ohne einen Parameter zu definieren, z. B. mit einer externen Funktion?Wert direkt im PHP-Konstruktor mit einer externen Funktion zuweisen

Beispiel

function my_external_function() { 

    return 'Good Morning World'; 

} 

class MyClass { 

    protected $_my_property; 

    public function __construct() { 

     $this->_my_property = my_external_function() != '' ? my_external_function() : 'Good night World!'; 

    } 

    public function getOtherMethod() { 

     return $this->_my_property; 

    } 

} 

$obj = new MyClass(); 
echo $obj->getOtherMethod(); 
+0

Warum ja, ja Sie können ... – AbraCadaver

+1

Haben Sie es versucht? Obwohl die Funktion zweimal aufgerufen wird, ist sie sehr ineffizient –

+0

Warum möchten Sie das tun? Nur neugierig. –

Antwort

1

Sie können dies tun. Der Code in Ihrer Frage funktioniert, aber es gibt ein Problem mit diesem Ansatz.

Wenn Sie Ihre Klasse auf diese Weise schreiben, hängt sie immer von dieser externen Funktion ab, aber sie hat keine Kontrolle darüber, ob sie überhaupt existiert oder nicht, ob sie einen Wert zurückgibt, den der Konstruktor verwenden kann. Wenn Sie die externe Funktion verschieben, umbenennen oder ändern, kann dies das Verhalten Ihrer Klasse auf unvorhersehbare Weise ändern.

Ich würde stattdessen so etwas empfehlen, was meiner Meinung nach das erreichen kann, was Sie erreichen möchten (nicht sicher), ohne dass Ihre Klasse blind auf eine externe Funktion angewiesen ist.

class MyClass { 

    protected $_my_property = 'Good night World!'; // set a default value here 

    public function __construct($x = null) { // give your constructor an optional argument 
     if ($x) {        // use the optional argument if it's provided 
      $this->_my_property = $x; 
     } 
    } 

    public function getOtherMethod() { 
     return $this->_my_property; 
    } 
} 

können Sie immer noch eine Instanz der Klasse ohne Argument

$obj = new MyClass(); 

und erstellen, wenn Sie $obj->getOtherMethod(); rufen werden Sie den Standardwert erhalten.

Sie können weiterhin die externe Funktion verwenden; Lassen Sie es einfach seinen Wert in den Konstruktor Ihres Objekts übergeben, anstatt ihn im Konstruktor zu verwenden.

$obj = new MyClass(my_external_function()); 
+0

danke. Klärende Antwort! Sorry für Syntaxfehler, war ein Versehen! – thejester

1

Ja, aber Sie besser so heikel Abhängigkeiten vermeiden.

+0

Vielen Dank! – thejester

Verwandte Themen