Heim  >  Artikel  >  Backend-Entwicklung  >  Gibt es einen Konstruktor in PHP?

Gibt es einen Konstruktor in PHP?

藏色散人
藏色散人Original
2022-01-26 10:04:381811Durchsuche

Es gibt einen Konstruktor in PHP und seine Syntax lautet „__construct(mixed...$values ​​​​= „“): void“. Eine Klasse mit einem Konstruktor ruft diese Methode jedes Mal auf, wenn ein neues Objekt erstellt wird. Daher ist es sehr gut geeignet. Führen Sie vor der Verwendung des Objekts einige Initialisierungsarbeiten durch.

Gibt es einen Konstruktor in PHP?

Die Betriebsumgebung dieses Artikels: Windows 7-System, PHP-Version 7.1, DELL G3-Computer

Gibt es einen Konstruktor in PHP?

php-Konstruktor

__construct(mixed ...$values = ""): void

PHP ermöglicht Entwicklern, eine Methode als Konstruktor in einer Klasse zu definieren. Klassen mit einem Konstruktor rufen diese Methode jedes Mal auf, wenn ein neues Objekt erstellt wird. Daher eignet sie sich sehr gut für einige Initialisierungsarbeiten vor der Verwendung des Objekts.

Hinweis: Wenn ein Konstruktor in einer Unterklasse definiert ist, wird der Konstruktor seiner übergeordneten Klasse nicht implizit aufgerufen. Um den Konstruktor der übergeordneten Klasse auszuführen, müssen Sie parent::__construct() im Konstruktor der untergeordneten Klasse aufrufen. Wenn die Unterklasse keinen Konstruktor definiert, wird sie wie eine gewöhnliche Klassenmethode von der übergeordneten Klasse geerbt (sofern sie nicht als privat definiert ist).

Beispiel #1 Konstruktor in der Vererbung

<?php
class BaseClass {
    function __construct() {
        print "In BaseClass constructor\n";
    }
}
class SubClass extends BaseClass {
    function __construct() {
        parent::__construct();
        print "In SubClass constructor\n";
    }
}
class OtherSubClass extends BaseClass {
    // 继承 BaseClass 的构造函数
}
// In BaseClass constructor
$obj = new BaseClass();
// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();
// In BaseClass constructor
$obj = new OtherSubClass();
?>

Im Gegensatz zu anderen Methoden unterliegt __construct() bei der Vererbung keinen Signaturkompatibilitätsregeln.

Seit PHP 5.3.3 werden im Namespace Methoden mit demselben Namen wie der Klassenname nicht mehr als Konstruktoren verwendet. Klassen, die nicht im Namespace liegen, sind nicht betroffen. Der Konstruktor ist eine normale Methode, die automatisch aufgerufen wird, wenn das entsprechende Objekt instanziiert wird. Daher können beliebig viele Parameter definiert werden, die erforderlich sein können, Typen haben oder Standardwerte haben können. Die Parameter des Konstruktors werden in Klammern hinter den Klassennamen gesetzt.

Beispiel #2 Konstruktorparameter verwenden

<?php
class Point {
    protected int $x;
    protected int $y;
    public function __construct(int $x, int $y = 0) {
        $this->x = $x;
        $this->y = $y;
    }
}
// 两个参数都传入
$p1 = new Point(4, 5);
// 仅传入必填的参数。 $y 会默认取值 0。
$p2 = new Point(4);
// 使用命名参数(PHP 8.0 起):
$p3 = new Point(y: 5, x: 4);
?>

Wenn eine Klasse keinen Konstruktor hat und die Parameter des Konstruktors nicht erforderlich sind, können die Klammern weggelassen werden.

Konstruktor im alten Stil

Wenn eine Klasse im globalen Namespace vor PHP 8.0.0 eine Methode mit demselben Namen hat, wird sie in einen Konstruktor im alten Stil aufgelöst. Obwohl Funktionen als Konstruktoren verwendet werden können, ist diese Syntax veraltet und führt zu einem E_DEPRECATED-Fehler. Wenn __construct() und eine gleichnamige Methode gleichzeitig existieren, wird __construct() aufgerufen.

Methoden mit demselben Namen wie eine Klasse haben in den folgenden beiden Fällen keine besondere Bedeutung mehr: Klassen im Namespace und jede Klasse seit PHP 8.0.0.

Verwenden Sie __construct() in neuem Code.

Verbesserung der Konstruktorattribute

Ab PHP 8.0.0 können die Parameter des Konstruktors auch entsprechend auf Klassenattribute aktualisiert werden. Es ist üblich, dass Konstruktorparameter Klassenattributen zugewiesen werden, da sie sonst nicht bedient werden können. Die Funktion der Konstruktorförderung bietet Komfort für dieses Szenario. Das obige Beispiel kann also wie folgt umgeschrieben werden:

Beispiel Nr. 3 mit der Heraufstufung von Konstruktoreigenschaften

<?php
class Point {
    public function __construct(protected int $x, protected int $y = 0) {
    }
}

Wenn der Konstruktorparameter über eine Zugriffskontrolle (Sichtbarkeitsmodifikator) verfügt, behandelt PHP ihn als Objekteigenschaft und Konstruktor Geben Sie gleichzeitig einen Parameter ein und weisen Sie dem Attribut den Wert zu. Der Konstruktor kann leer sein oder andere Anweisungen enthalten. Nachdem der Parameterwert dem entsprechenden Attribut zugewiesen wurde, werden weitere Codeanweisungen im Text ausgeführt.

Nicht alle Parameter müssen verbessert werden. Es ist möglich, eine Mischung aus hochgestuften und nicht hochgestuften Parametern als Attribute zu haben, und diese müssen nicht in der richtigen Reihenfolge sein. Erhöhte Parameter haben keinen Einfluss auf Codeaufrufe innerhalb des Konstruktors.

Hinweis:

Der Typ der Objekteigenschaften kann nicht aufrufbar sein, um Verwirrung bei der Engine zu vermeiden. Daher kann der geförderte Parameter auch nicht aufrufbar sein. Alle anderen Typdeklarationen sind zulässig.

Hinweis:

Die in den Boost-Parametern des Konstruktors platzierten Eigenschaften werden gleichzeitig als Eigenschaften und Parameter kopiert.

Statische Erstellungsmethode

In PHP kann jede Klasse nur einen Konstruktor haben. Es gibt jedoch Situationen, in denen Objekte auf unterschiedliche Weise und mit unterschiedlichen Eingaben konstruiert werden müssen. In diesem Fall wird empfohlen, ein statisches Methoden-Wrapping-Konstrukt zu verwenden.

Beispiel Nr. 4: Verwendung von Static zum Erstellen einer Methode

<?php
class Product {
    private ?int $id;
    private ?string $name;
    private function __construct(?int $id = null, ?string $name = null) {
        $this->id = $id;
        $this->name = $name;
    }
    public static function fromBasicData(int $id, string $name): static {
        $new = new static($id, $name);
        return $new;
    }
    public static function fromJson(string $json): static {
        $data = json_decode($json);
        return new static($data[&#39;id&#39;], $data[&#39;name&#39;]);
    }
    public static function fromXml(string $xml): static {
        // 自定义代码逻辑。
        $data = convert_xml_to_array($xml);
        $new = new static();
        $new->id = $data[&#39;id&#39;];
        $new->name = $data[&#39;name&#39;];
        return $new;
    }
}
$p1 = Product::fromBasicData(5, &#39;Widget&#39;);
$p2 = Product::fromJson($some_json_string);
$p3 = Product::fromXml($some_xml_string);

Sie können den Konstruktor auf „privat“ oder „geschützt“ setzen, um zusätzliche Aufrufe durch Sie selbst zu verhindern. Derzeit können nur statische Methoden eine Klasse instanziieren. Da sie sich in derselben definierten Klasse befinden, können sie auf private Methoden zugreifen und müssen sich nicht in derselben Objektinstanz befinden. Natürlich muss der Konstruktor nicht auf privat gesetzt werden. Ob dies sinnvoll ist, hängt von der tatsächlichen Situation ab.

Drei statische Methoden zeigen, wie Objekte auf unterschiedliche Weise instanziiert werden können.

  • fromBasicData() übergibt alle erforderlichen Parameter an den Konstruktor, erstellt das Objekt und gibt das Ergebnis zurück.

  • fromJson() akzeptiert einen JSON-String, verarbeitet ihn in das vom Konstruktor benötigte Format vor und gibt ein neues Objekt zurück.

  • fromXml() akzeptiert einen XML-String, analysiert ihn und erstellt ein einfaches Objekt. Da die Parameter optional sind, kann der Konstruktor aufgerufen werden, ohne dass alle Parameter ignoriert werden. Weisen Sie dann den Eigenschaften des Objekts Werte zu und geben Sie das Ergebnis zurück.

In den obigen drei Beispielen wird das statische Schlüsselwort in den Klassennamen der Klasse übersetzt, in der sich der Code befindet. In diesem Fall ist es Produkt.

Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonGibt es einen Konstruktor in PHP?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn