Warum neue Statik zurücksenden? (PHP)

Lesezeit: 4 Minuten

Benutzer-Avatar
Peramika

Warum einige Entwickler eine Methode erstellen, die zurückkehrt neue Statik? Was ist der Grund, eine Methode zu haben, die gibt neue Statik zurück? Ich frage nicht, was der Unterschied zwischen Static und Self ist oder was Static & Self bedeuten. Hier ist zum Beispiel eine einfache Klasse:

<?php

class Expression
{
    public static function make()
    {
        return new static;
    }


    public function find($value)
    {
        return "https://stackoverflow.com/" . $value ."https://stackoverflow.com/";
    }

    public function then($value)  
    {
        return $this->find($value);
    }

    public function hi($value)  
    {
        return "hi";
    }

}

Wie Sie sehen können, gibt es eine statisch Methode machen() die zurückkehrt neue Statik. Dann rufen einige Entwickler andere Methoden wie diese auf:

$regex = Expression::make()->find('www');

Was ist der Zweck davon? Ich sehe, dass wir hier nicht verwenden neuer Ausdruck Syntax, und wenn das der Punkt ist – warum machen Sie dann nicht alle Methoden statisch? Was ist der Unterschied, was ist der Grund, diese eine Methode zu haben, die zurückkehrt? neue Statik (während andere Methoden nicht statisch sind)?

  • Mögliches Duplikat von was bedeutet neue Statik?

    – Ankur Tiwari

    26. Mai 2016 um 12:17 Uhr

  • Die Antwort auf New self vs. new static erklärt den Unterschied deutlich.

    Benutzer1342582

    26. Mai 2016 um 12:20 Uhr

  • @Ankur Tiwari bin ich nicht fragen, was der Unterschied zwischen ist statisch & selbstoder was statisch & selbst tun.

    – Peramika

    26. Mai 2016 um 12:30 Uhr

  • @jeyoung Meine Frage bezieht sich nicht auf den Unterschied zwischen New Self und New Static …

    – Peramika

    26. Mai 2016 um 12:38 Uhr

  • @PeraMika Es sah so aus, als hätten Sie den Zweck von nicht verstanden new static(), aber wenn doch… Es ist zur Wiederverwendung. Sie können die Statik definieren make -Methode in einer einzelnen Basisklasse, und Sie haben die gleiche Funktionalität von abgeleiteten Klassen.

    Benutzer1342582

    26. Mai 2016 um 12:43 Uhr

Benutzer-Avatar
verzeihen

new static instanziiert ein neues Objekt aus der aktuellen Klasse und arbeitet mit späten statischen Bindungen (instanziiert die Unterklasse, wenn die Klasse eine Unterklasse war, ich gehe davon aus, dass Sie das verstehen).

Ein … haben static Methode für eine Klasse, die eine neue Instanz derselben zurückgibt, ist an Alternativer Konstrukteur. Das heißt, normalerweise ist Ihr Konstruktor public function __constructund normalerweise erfordert es eine bestimmte Reihe von Parametern:

class Foo {
    public function __construct(BarInterface $bar, array $baz = []) { ... }
}

Mit einem Alternativer Konstrukteur ermöglicht es Ihnen, verschiedene Standardwerte oder bequeme Verknüpfungen bereitzustellen, um diese Klasse zu instanziieren, ohne diese spezifischen Argumente bereitstellen zu müssen und/oder um unterschiedliche Argumente bereitstellen zu können, die der alternative Konstruktor in die kanonischen umwandelt:

class Foo {

    public function __construct(BarInterface $bar, array $baz = []) { ... }

    public static function fromBarString($bar) {
        return new static(new Bar($bar));
    }

    public static function getDefault() {
        return new static(new Bar('baz'), [42]);
    }

}

Nun, obwohl Ihr kanonischer Konstruktor eine Reihe komplexer Argumente erfordert, können Sie einfach mit eine Standardinstanz Ihrer Klasse erstellen, die wahrscheinlich für die meisten Anwendungen geeignet ist Foo::getDefault().

Das kanonische Beispiel in PHP dafür ist DateTime und DateTime::createFromFormat.

In Ihrem konkreten Beispiel macht der alternative Konstruktor eigentlich nichts, ist also eher überflüssig, aber ich vermute, das liegt daran, dass es sich um ein unvollständiges Beispiel handelt. Wenn es tatsächlich einen alternativen Konstruktor gibt, der nichts anderes tut als new statices ist wahrscheinlich nur als Bequemlichkeitssyntax gedacht (new Foo)->was ich fragwürdig finde.

  • Jetzt verstehe ich den Zweck, vielen Dank!

    – Peramika

    26. Mai 2016 um 12:50 Uhr

  • Ich vermute, dass der Konstruktor wirklich leer ist und dies nur für Zucker gemacht ist. Wahrscheinlich, dass der Entwickler es vorzieht, neue Objekte auf diese Weise aufzurufen, um sie zusammenzufassen. Also anstatt zu schreiben: $search = (new Expression)->find("wow");er kann nur geschrieben $search = Expression::make()->find("wow"). Natürlich ist es dasselbe.

    – Max Cuttins

    4. Dezember 2018 um 19:56 Uhr

Benutzer-Avatar
Sergej Schutschkin

Vollständige Antwort hier

TLDR
get_called_class().

class A {
    public static function get_self() {
        return new self();
    }

    public static function get_static() {
        return new static();
    }
}

class B extends A {}

echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A
echo get_class(B::get_self());  // A
echo get_class(B::get_static()); // B

  • Nicht wirklich eine Antwort auf die Frage, aber immer noch nützlich, zeigt deutlich den Unterschied zwischen Selbst und Statik.

    – Przemek K.

    8. Juli 2017 um 12:06 Uhr


  • @sergeyshuchkin tolles Beispiel … mit wenig Beschreibung hilfreicher wird es sein

    – Äh. Amit Joshi

    3. April 2021 um 8:22 Uhr

  • Es scheint, dass diese Antwort schamlos ohne Namensnennung kopiert und dann von dieser anderen vollständigeren Antwort von @BoltClock stackoverflow.com/a/5197655/190955 falsch geändert wurde. Die Antwort wurde dann auf Richtigkeit bearbeitet – zurück zum Original. Ich habe versucht, eine Namensnennung und eine vollständigere Erklärung zu bearbeiten, aber die Bearbeitungswarteschlange ist voll.

    – TonyG

    11. Februar um 19:03 Uhr


1312340cookie-checkWarum neue Statik zurücksenden? (PHP)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy