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

Tüm bunlar bir sınıf içinde bir yöntem içinde, bu kod parçasının ne yaptığını teknik olarak anlamaya çalışıyorum. Google dünyasında dolaştım. Ama beni bir cevaba götürecek hiçbir şey bulamıyorum. Bu, söylenmenin başka bir yolu.

$model = new static $variable; 

Ayrıca bu ne

$model = new static; 

hakkında Bunun anlamı o null değer bir değişken ve ayarları başlatılıyor ediyorum ama sadece değişken yöntemi çalıştırdıktan sonra değerini kaybetmemek için ısrar ediyorum mu?

+1

[Geç Statik Bağlamalar] bölümünü okuyun (http://us.php.net/manual/en/language.oop5.late-static-bindings.php). – DCoder

cevap

-2

kelime yeni zaten tanımlı sınıfın

$ modeli = new statik ($ değişken) bir nesne yapmak için kullanılır;

işte bu durumda

+1

Statik bir sınıf olduğunu düşünmüyorum, değişken kapsamı ... yanlış mıyım? –

8

statik statik sınıfının bir örneğidir akım nesne kapsamı anlamı oluşturulan modelin bir nesne yoktur. Geç statik bağlanmada kullanılır.

Normalde bu, self'u kullanarak aynı olacak. Farklı olduğu yer, kapsamdaki referansın bir ebeveyn üzerinde tanımlandığı ancak çocukta çağrıldığı bir nesne heirarşiye sahip olduğunuz zamandır. Statik başvurmak oysa bu durumda kendini veliler kapsamını başvurmak çocuğun

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 

Mevcut nesne kapsamı olmanın tanımlayan kapsam olmak ve statik olarak kendini düşünmek en kolay yoldur.

2

self basitçe oluşur sınıfı için bir "kısa yol adı". static zaman mevcut sınıfını belirtmektedir olan yeni late static binding kuzeni vardır. Yani Bir dersi genişletirken, static, alt bağlamdan çağrılırsa alt sınıfa da başvurabilir.

new static sadece akım sınıfa yeni örneği yapmak demektir ve sadece new self daha dinamik kuzeni.

Ve evet, static == daha dinamik gariptir.

+0

Daha fazla bilgi için arayışımda Son zamanlarda bu geç statik bağlama deliline baktım ve dürüstçe söyleyebilirim, Beynimi acıtıyor. – Dale

+0

Bu o kadar da korkunç değil. Aynısı, bu $ $, her zaman davrandı, sadece nesneler yerine sınıflar için. – deceze

+0

Sanırım, çünkü son satırda söylediğin gibi, statik aslında dinamik, sadece beni hemen kokunun dışına fırlatıyor :) – Dale

0

Sınıf içinden bir sınıf nesnesi nesnesini başlatmak ve sınıfta uzantılarla çalışmasını sağlamak için new static()'u kullanabilirsiniz.

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

Sen static içeri denir sınıfa bir referanstır bir sınıf bağlamında koymak zorunda. Biz can sen örneğinin __construct işleve bir parametre olarak isteğe geçişli $variable oluşturma.böylece gibi

: Burada static

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

myClass atıfta ve biz __construct işleve bir parametre olarak değişken 'bazı parametre' geçmektedir.