2016-05-26 10 views
7

Warum einige Leute eine Methode erstellen, die neue statische zurückgibt, anstatt alle Methoden statisch zu machen? Was ist der Grund für diese Methode, die neue statische zurückgibt? Ich frage nicht, was ist der Unterschied zwischen statisch und selbst, oder was statische & selbst bedeuten. Zum Beispiel, hier ist eine einfache Klasse:Warum neue statische zurückgeben? (PHP)

<?php 

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


    public function find($value) 
    { 
     return '/' . $value .'/'; 
    } 

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

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

} 

Wie Sie sehen können, gibt es eine statische Methode make() die neue statische zurückgibt. Dann rufen einige Leute andere Methoden wie folgt an:

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

Was ist der Zweck davon? Ich sehe, dass wir hier nicht neue Ausdruck Syntax verwenden, und wenn das der Punkt ist - warum sie nicht alle Methoden gemacht werden, um zum Beispiel statisch zu sein? Was ist der Unterschied, was ist der Grund, diese Methode zu haben, die neue statische zurückgibt?

+2

Mögliches Duplikat [was neue statisch bedeutet?] (Http://stackoverflow.com/questions/15898843/what-means-new-static) –

+1

Die Antwort auf [Neues Selbst gegen neue statisch] (http://stackoverflow.com/questions/5197300/new-self-vs-new-static?rq=1) erklärt den Unterschied deutlich. –

+0

@Ankur Tiwari Ich bin ** nicht ** fragen, was ist der Unterschied zwischen _static_ & _self_, oder was _static_ & _self_ tun. – PeraMika

Antwort

10

new static instanziiert ein neues Objekt aus der aktuellen Klasse und arbeitet mit späten statischen Bindungen (instanziiert die Unterklasse, wenn die Klasse unterklassifiziert wurde, ich nehme an, dass Sie das verstehen).

Mit einer static Methode für eine Klasse, die eine neue Instanz derselben zurückgibt, ist ein alternativer Konstruktor. Bedeutung, in der Regel Ihres Konstruktor ist public function __construct, und in der Regel bedarf es eine bestimmte Gruppe von Parametern:

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

einen alternativen Konstruktor Mit Ihnen ohne mit unterschiedlichen Standardwerte, oder Bequemlichkeit Abkürzungen zu instanziiert diese Klasse zu schaffen, ermöglicht es diejenigen liefern spezifische Argumente und/oder für verschiedene Argumente liefern zu können, die die alternative Konstruktor auf die kanonischen konvertieren:

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, auch wenn Ihr kanonischen Konstruktor erfordert eine Reihe von komplexen Argumenten, Sie können eine Standardinstanz Ihrer Klasse erstellen, die wahrscheinlich für die meisten Anwendungen geeignet ist, einfach mit Foo::getDefault().

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

In Ihrem konkreten Beispiel tut der alternative Konstruktor eigentlich nichts, also ist es ziemlich überflüssig, aber ich nehme an, das liegt daran, dass es ein unvollständiges Beispiel ist. Wenn es tatsächlich einen alternativen Konstruktor gibt, der nichts anderes tut als new static, ist es wahrscheinlich nur als Convenience-Syntax über (new Foo)-> gemeint, was ich fragwürdig finde.

+0

Jetzt verstehe ich den Zweck, vielen Dank! – PeraMika

0

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(B::get_self()); // A 
echo get_class(B::get_static()); // B 
echo get_class(A::get_self()); // A 
echo get_class(A::get_static()); // A 
+0

Nicht wirklich eine Antwort auf die Frage, aber immer noch nützlich, zeigt deutlich den Unterschied zwischen selbst und statisch. –