2013-06-07 12 views
8
$model = new static($variable); 

Wszystkie te są w ramach metody wewnątrz klasy, próbuję technicznie zrozumieć, co ten kawałek kodu robi. Biegałem w świecie Google. Ale nie mogę znaleźć niczego, co doprowadziłoby mnie do odpowiedzi. Czy to tylko inny sposób powiedzenia.

$model = new static $variable; 

także co o tym

$model = new static; 

Czy to znaczy, że jestem inicjalizacji zmiennej i ustawienia jego wartość null, ale jestem po prostu utrzymujących zmienna, aby nie stracić wartość po uruchomieniu metody?

+1

Przeczytaj [późne wiązania statyczne] (http://us.php.net/manual/en/language.oop5.late-static-bindings.php). – DCoder

Odpowiedz

-2

Słowo kluczowe nowy służy do tworzenia obiektu o zdefiniowanej klasy

$ = new Model statyczny ($ zmienna);

więc tutaj jest przedmiotem modelu stworzonego który jest instancją klasy statycznej

+1

Nie sądzę, statyczne jest klasa, to zakres zmiennych ... czy to jest czy jestem nie tak? –

8

statyczne w tym przypadku oznacza, aktualny zakres obiektów. Jest używany w późnym wiązaniu statycznym.

Zwykle będzie to takie samo, jak przy użyciu self. Miejsce, w którym się różni, jest wtedy, gdy masz dziedziczną hierarchię, w której odniesienie do zakresu jest zdefiniowane dla rodzica, ale jest wywoływane na dziecku. samo w tym przypadku byłoby odwołać się do zakresu rodziców natomiast statyczna będzie odwoływać się do dziecka

class A{ 
    function selfFactory(){ 
     return new self(); 
    } 

    function staticFactory(){ 
     return new static(); 
    } 
} 

class B extends A{ 
} 


$b = new B(); 

$a1 = $b->selfFactory(); // a1 is an instance of A 

$a2 = $b->staticFactory(); // a2 is an instance of B 

Najłatwiej myśleć o sobie jako bycie zakres definiowania i statyczna jest obecny zakres przedmiot.

2

self jest po prostu „nazwa skrót” dla klasy Występuje w. static jest jego nowsza late static binding kuzyn, który odnosi się zawsze do bieżącym klasie. To znaczy. podczas rozszerzania klasy, static może również odwoływać się do klasy potomnej, jeśli jest wywoływana z kontekstu podrzędnego.

new static tylko oznacza zrobić nową instancję bieżącej klasy i jest po prostu bardziej dynamiczny kuzyn new self.

I tak, static == bardziej dynamiczne jest dziwne.

+0

W moich poszukiwaniach większej wiedzy ostatnio zajrzałem do tego późnego, statycznego, wiążącego szaleństwa i mogę szczerze powiedzieć, że rani mój mózg. – Dale

+0

To naprawdę nie jest takie straszne. To samo "$ this" zawsze się zachowywało, tylko dla klas zamiast obiektów. – deceze

+0

Myślę, że to dlatego, że jak mówisz w ostatnim wierszu, statyczny jest w rzeczywistości dynamiczny, po prostu wyrzuca mnie z zapachu :) – Dale

0

Można użyć new static(), aby utworzyć instancję grupy obiektów klasy z klasy i zezwolić jej na pracę z rozszerzeniami klasy.

class myClass { 
    $some_value = 'foo'; 
    public function __construct($id) { 
    if($this->validId($id)) { 
     $this->load($id); 
    } 
    } 

    protected function validId($id) { 
    // check if id is valid. 
    return true; // or false, depending 
    } 

    protected function load($id) { 
    // do a db query and populate the object's properties 
    } 

    public static function getBy($property, $value) { 
    // 1st check to see if $property is a valid property 
    // if yes, then query the db for all objects that match 
    $matching_objects = array(); 
    foreach($matching as $id) { 
     $matching_objects[] = new static($id); // calls the constructor from the class it is called from, which is useful for inheritance. 
    } 
    return $matching_objects; 
    } 
} 


myChildClass extends myClass { 
    $some_value = 'bar'; // 
} 


$child_collection = myChildClass::getBy('color','red'); // gets all red ones 

$child_object = $child_collection[0]; 

print_r($child_object); // you'll see it's an object of myChildClass 
1

Musisz umieścić go w kontekście klasy gdzie static jest odniesienie do klasy nazywa się w. Możemy opcjonalnie wprost $variable jako parametr do funkcji __construct instancji jesteś tworzenie.

tak:

class myClass { 

    private $variable1; 

    public function __construct($variable2) { 
     $this->variable1 = $variable2; 
    } 

    public static function instantiator() { 
     $variable3 = 'some parameter'; 
     $model = new static($variable3); // <-this where it happens. 
     return $model; 
    } 
} 

Tutaj static dotyczy myClass i mijamy zmienną „jakiś parametr” jako parametr do funkcji __construct.