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)?
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 __construct
und 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 static
es ist wahrscheinlich nur als Bequemlichkeitssyntax gedacht (new Foo)->
was ich fragwürdig finde.
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
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 definierenmake
-Methode in einer einzelnen Basisklasse, und Sie haben die gleiche Funktionalität von abgeleiteten Klassen.– Benutzer1342582
26. Mai 2016 um 12:43 Uhr