Frage

Gibt es einen Vorteil bei der Verwendung __construct() anstelle des Namens der Klasse für einen Konstruktor in PHP?

Beispiel (__construct):

class Foo {
    function __construct(){
        //do stuff
    }
}

Beispiel (benannt):

class Foo {
    function Foo(){
        //do stuff
    }
}

Mit dem __construct Verfahren (erstes Beispiel) ist möglich, da PHP 5.

eine Methode mit dem gleichen Namen wie die Klasse als Konstruktor (zweites Beispiel) zu haben ist möglich ab PHP Version 4 bis Version 7.

War es hilfreich?

Lösung

Ich bin mit Gizmo, der Vorteil ist, so muss man es nicht umbenennen, wenn Sie Ihre Klasse umbenennen. DRY.

Und falls Sie ein Kind Klasse haben, können Sie anrufen

parent::__construct()

den übergeordneten Konstruktor aufzurufen. Wenn weiter unten auf der Spur, die Sie die Klasse ändern das Kind Klasse erbt von, Sie müssen nicht auf den übergeordneten das Konstrukt Aufruf ändern.

Es scheint wie eine kleine Sache, aber fehlt den Konstruktor Rufname Ihre Eltern-Klassen vorgenommen werden könnte schaffen subtile (und nicht so subtil) Fehler.

Zum Beispiel, wenn Sie eine Klasse in Ihre heirachy eingefügt, aber vergessen, die Konstruktoraufrufe zu ändern, könnten Sie begann Konstrukteure von Großeltern statt Eltern anrufen. Dies könnte oft zu unerwünschten Ergebnissen führen, die schwierig sein könnte, zu bemerken.

Auch beachten, dass

  

Ab PHP 5.3.3, Methoden mit dem gleichen Namen wie das letzte Element eines Namespace Klassenname wird nicht mehr als Konstruktor behandelt werden. Diese Änderung wirkt sich nicht auf nicht-Namespace-Klassen.

Quelle: http://php.net/manual/en/language. oop5.decon.php

Andere Tipps

__construct wurde in PHP5 eingeführt. Es ist so, wie Sie sollen es jetzt tun. Ich bin nicht bekannt, dass Vorteile per se, aber.

Von dem PHP-Handbuch:

Für Abwärtskompatibilität, wenn PHP 5 keine __construct () Funktion für eine bestimmte Klasse finden kann, wird es für die alten Stil Konstruktor Funktion mit dem Namen der Klasse suchen. Effektiv bedeutet dies, dass der einzige Fall, dass Kompatibilitätsprobleme ist, wenn die Klasse hatte eine Methode namens __construct (), die für unterschiedliche Semantik verwendet haben würde

Wenn Sie auf PHP5 sind würde ich empfehlen __construct mit an anderer Stelle machen PHP-Look zu vermeiden.

Der Hauptvorteil ich für __construct sehen, ist, dass Sie zu Ihrem Konstruktor nicht umbenennen, wenn Sie Ihre Klassennamen ändern.

Heute ist die akzeptierte Antwort ist veraltet.

Umbenennen von Klassen ist eine schlechte Praxis: Sie haben sich daran zu erinnern, was und wo jedes Mal umbenennen Sie auf neuere Version aktualisieren. Manchmal (wie mit Reflection oder komplexer Abhängigkeitsstruktur), kann es ohne radikalen refactoring unmöglich sein. Und das ist zufälligen Komplexität Sie vermeiden möchten. Deshalb Namespaces wurde in PHP eingeführt. Java, C ++ oder C # nicht __construct verwenden, verwenden sie genannt Konstruktor und es gibt kein Problem mit ihnen.

  

Ab PHP 5.3.3, Methoden mit dem gleichen Namen wie das letzte Element eines Namespaced Klassenname wird nicht mehr als Konstruktor behandelt werden. Diese Änderung hat keinen Einfluss auf nicht-Namespace Klassen .

Beispiel:

namespace Foo;
class Test {
  var $a = 3;

  function Test($a) {
    $this->a = $a;
  }

  function getA() {
    return $this->a;
  }
}

$test = new Test(4);
echo $test->getA(); // 3, Test is not a constructor, just ordinary function

Beachten Sie, dass Konstrukteure benannt sind nicht veraltet (PHP 5.5 heute). Sie können jedoch nicht sagen voraus, dass die Klasse nicht im Namensraum verwendet werden, also __construct preffered werden sollte.

Klarstellung über die schlechte Praxis oben erwähnten (Dennis)

Irgendwo im Code könnten Sie Reflection :: getName () ; wenn Sie die Klasse umbenennen, müssen Sie daran denken, wo Sie Reflexion verwendet und überprüfen, ob das getName() Ergebnis noch konsistent in Ihrer Anwendung ist. Je mehr Sie brauchen etwas Bestimmtes zu erinnern, desto wahrscheinlicher etwas vergessen wird, die in der App in Bugs führt.

Die Eltern haben nicht die Kontrolle über alle Klassen in der Welt, die von ihnen abhängt. Wenn allow_url_include aktiviert ist, könnten einige andere Web werden mit der Klasse von Ihrem Server, die zum Absturz bringen können, wenn Sie einige Klassen umbenannt. Noch schlimmer ist es in kompilierten Sprachen erwähnt. Oben: die Bibliothek kann in anderem Code kopiert und gebündelt wird

Es gibt keinen Grund, warum Klasse umbenennen:

  • , wenn die Klassennamenskonflikte, die Verwendung von Namespaces
  • , wenn die Klassen Verantwortung verschiebt, leiten eine andere Klasse statt

In PHP-Klassen im Namensraum, wobei das Verfahren mit dem gleichen Namen sollte auf jedem Fall vermieden werden: intuitiv sollte es eine Aufgabe erzeugt die Klasse erstellt; wenn es etwas anderes tut, warum sie den gleichen Namen geben? Es sollte auch ein Konstruktor und nichts sein. Das Hauptproblem ist, dass das Verhalten eines solchen Verfahrens auf Namespace-Nutzung abhängt.

Es gibt kein Problem mit __construct Konstrukteuren in PHP. Aber es war nicht die klügste Idee, den Namen Konstrukteure zu ändern.

Der beste Vorteil von __contruct() statt ClassName() verwenden ist, wenn Klassen erstrecken. Es ist viel einfacher parent::__construct() statt parent::ClassName() zu nennen, da es zwischen den Klassen wiederverwendbar ist und die Eltern können leicht geändert werden.

In Ihrem Beispiel Foo::Foo wird manchmal ein PHP 4 oder im alten Stil Konstruktor genannt, weil es von den Tagen PHP kommt 4:

class Foo {
    // PHP 4 constructor
    function Foo(){
        //do stuff
    }
}

PHP 4 Konstrukteuren werden veraltet, aber nicht entfernt in PHP 7. Sie werden nicht mehr gilt als Konstrukteure in PHP 8. Zukünftige Kompatibilität in jeder Situation ist auf jeden Fall ein wichtiger Grund, diese Funktion nicht zu verwenden.

In PHP 5 ist der Vorteil wäre, dass die Leistung besser wäre. Es wird unter dem Namen __construct zunächst für einen Konstruktor suchen und wenn es nicht so nicht findet, wird es für den Bau mit dem Namen className aussehen. Also, wenn es einen Konstruktor mit dem Namen __construct findet es muss nicht für einen Konstruktor mit dem Namen className suchen.

Nun, es ist schon ein paar Jahre her, seit diese Frage gestellt wurde, aber ich glaube, ich habe diese eine noch zu beantworten, weil die Dinge sich geändert hat und für die Leser in der Zukunft möchte ich auf dem neuesten Stand der Informationen halten!


So in PHP-7 sie die Möglichkeit, entfernen den Konstruktor als eine Funktion mit dem gleichen Namen wie die Klasse zu erstellen. Wenn Sie noch es tun, werden Sie eine E_DEPRECATED bekommen.

Sie können mehr über diesen Vorschlag lesen (der Vorschlag angenommen wird) hier:   https://wiki.php.net/rfc/remove_php4_constructors

Und ein Zitat von dort:

  

PHP 7 emittieren E_DEPRECATED , wenn a PHP 4 Konstruktor definiert . Wenn die Methodennamen die Klassennamen übereinstimmt, ist die Klasse in einem Namespace nicht, und ein PHP 5 Konstruktor (__construct) nicht vorhanden ist, dann wird ein E_DEPRECATED emittiert werden. PHP 8 stoppt E_DEPRECATED emittiert und die Methoden werden nicht als Konstrukteure erkannt werden.

Auch Sie werden keine E_STRICT in php-7 erhalten, wenn Sie eine Methode mit dem gleichen Namen wie die Klasse und einem __construct() definieren.

Sie können dies auch hier:

  

PHP 7 wird auch stoppen emittierende E_STRICT , wenn eine Methode mit dem gleichen Namen wie die Klasse sowie __construct vorhanden ist.


Also ich würde Sie empfehlen, __construct() zu verwenden, da Sie damit weniger Probleme in der Zukunft haben werden.

Vorwärts-Kompatibilität. Es gibt immer eine Chance, dass Legacy-Code, der für die Abwärtskompatibilität willen in der Sprache übrig geblieben ist wird in einer zukünftigen Version entfernt werden.

Wenn es Methoden __construct und SameAsClassName Methode dann wird __construct ausgeführt wird, wird SameAsClassName Methode übersprungen werden.

Ich denke, dass der Hauptgrund ist, dass die Sprache Konvention ist. Sie brauchen nicht, eine Sprache zu zwingen, wie jemand zu handeln anders.

Ich meine, in Objective-C Präfix Sie die Konstrukteure mit -init, zum Beispiel. Sie können Ihren eigenen Konstruktor Ihrer Klasse Namen machen, aber warum? Ist ther irgendein Grund dieses Schema anstelle der Sprachkonvention zu verwenden?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top