2013-04-09 19 views
47

bazı çerçeveler içinde bu kod satırını gördü?

+0

Bu hangi çerçeve oldu? –

+0

örneğin laravel, ama ben sadece çekirdekte değil, onların api kullanırken değil – Hello

+2

Daha fazla bilgi için bu sayfayı kontrol edin; http://stackoverflow.com/questions/5197300/new-self-vs-new-static –

cevap

76

Bir sınıfın üye işlevi içinde new self() yazdığınızda, bu sınıfın bir örneğini alırsınız. That's the magic of the self keyword.

Yani:

class Foo 
{ 
    public static function baz() { 
     return new self(); 
    } 
} 

$x = Foo::baz(); // $x is now a `Foo` 

Sen almak bir Foo kullandığınız statik eleme türetilmiş bir sınıf için bile olsa:

class Bar extends Foo 
{ 
} 

$z = Bar::baz(); // $z is now a `Foo` 

Eğer (bir anlamda) polimorfizmi etkinleştirmek isterseniz, ve PHP, kullandığınız niteleyiciyi alsın, static anahtar kelimesi için self anahtar sözcüğünü kullanabilirsin:

class Foo 
{ 
    public static function baz() { 
     return new static(); 
    } 
} 

class Bar extends Foo 
{ 
} 

$wow = Bar::baz(); // $wow is now a `Bar`, even though `baz()` is in base `Foo` 

Bu, late static binding olarak bilinen PHP özelliği ile mümkündür; static anahtar kelimesinin diğer daha geleneksel kullanımları için karıştırmayın.

+10

hmm..shortly: new static() - hangi sınıfın genişletildiğine bakılmaksızın geçerli sınıfın nesnesini döndürür ve yeni self() - nesneyi, bu yöntemin bildirildiği veya genişletildiği sınıftan döndürür (son sürümü işlev) ... doğru anlıyorum? – Hello

+1

@Hello: Temel olarak. –

+1

evet benim için yeterli) temelde bile) – Hello

İlgili konular