2016-05-26 37 views
7

Dlaczego niektórzy ludzie tworzą jedną metodę, która zwraca nowe statyczne zamiast dokonywania wszystkich metod statycznych? Jaki jest powód, dla którego ta metoda powoduje, że zwraca nowy numer statyczny? Nie pytam, jaka jest różnica między statycznym a własnym, ani tym, co statyczne. Na przykład, tutaj jest jedna prosta klasa:Dlaczego zwracać nowe statyczne? (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"; 
    } 

} 

Jak widać, istnieje statyczny metoda make() która zwraca nową statyczną. Następnie niektórzy nazywają inne metody takie jak to:

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

Jaki jest tego cel? Widzę, że tutaj nie używamy składni new Expression, a jeśli o to chodzi - dlaczego nie stworzyli wszystkich metod, na przykład statycznych? Jaka jest różnica, jaki jest powód posiadania tej metody, która zwraca nowy statyczny?

+2

Możliwy duplikat [co oznacza nowy statyczny?] (Http://stackoverflow.com/questions/15898843/what-means-new-static) –

+1

Odpowiedź na [New siebie vs. nowy statyczny] (http://stackoverflow.com/questions/5197300/new-self-vs-new-static?rq=1) wyjaśnia wyraźnie różnicę. –

+0

@Ankur Tiwari Ja ** nie ** pytam, jaka jest różnica między _static_ i _self_ lub co _static_ i _self_ zrobić. – PeraMika

Odpowiedz

10

tworzy instancję nowego obiektu z bieżącej klasy i działa z opóźnionymi powiązaniami statycznymi (tworzy podklasę, jeśli klasa była podklasowana, domyślam się, że to rozumiesz).

Posiadanie metody static dla klasy, która zwraca taką samą nową instancję, jest alternatywnym konstruktorem . Co oznacza, zazwyczaj konstruktora jest public function __construct i zazwyczaj wymaga pewnej kilka parametrów:

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

mającą alternatywnego konstruktora pozwala zapewnić różne ustawienia domyślne, lub skróty wygodę instancję tej klasy bez konieczności dostarczania tych konkretne argumenty i/lub do bycia w stanie zapewnić różne argumenty, które będą alternatywą konstruktor konwertuje do tych kanonicznych:

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]); 
    } 

} 

teraz, mimo że konstruktor kanoniczne wymaga sporo skomplikowanych argumentów, możesz utworzyć domyślną instancję klasy, która prawdopodobnie będzie odpowiednia dla większości zastosowań, po prostu z Foo::getDefault().

Przykładem kanonicznym w języku PHP jest DateTime i DateTime::createFromFormat.

W konkretnym przykładzie alternatywny konstruktor nie robi właściwie nic, więc jest raczej zbędny, ale oczekuję, że to dlatego, że jest to niekompletny przykład. Jeśli rzeczywiście istnieje konstruktor alternatywny, który nie robi nic innego niż new static, prawdopodobnie jest to po prostu rozumiane jako składnia wygody ponad (new Foo)->, co uważam za wątpliwe.

+0

Teraz rozumiem cel tego, dziękuję bardzo! – 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

Naprawdę nie jest to odpowiedź na pytanie, ale nadal przydatne, wyraźnie pokazuje różnicę między sobą i statyczne. –