Yanıtlar:
aynı sonuçları alacak mıyım?
Pek sayılmaz. Gerçi PHP 5.2 için bir çözüm bilmiyorum.
Arasındaki fark nedir
new self
venew static
?
self
new
anahtar kelimenin gerçekte yazıldığı sınıfa karşılık gelir .
static
PHP 5.3'ün geç statik bağlamaları için, hiyerarşide yöntem olarak adlandırdığınız herhangi bir sınıfı ifade eder.
Aşağıdaki örnekte, B
her iki yöntemi de miras alır A
. self
Çağırma bağlı A
o 'de tanımlandığı çünkü A
ise, birinci yöntemin bireyin uygulanması static
adlandırılan sınıfa bağlı olduğu (bakınız ayrıca 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
get_called_class()
, her zaman yapabilirsiniz , ki bu etkili bir şekilde aynıdır __CLASS__
, ancak LSB uyumludur.
self
kendi kendine döneceğini ve static
geçersiz kılınamayacak bir şeyi döndüreceğini düşünürdünüz ... Ama işte tam tersi. PHP'nin isimlendirilmesinden, konvansiyonlarından ve genel tarzından etkilenmeyi hiç bırakmam. -_-
Bu kodun yöntemi statik değilse, kullanarak 5.2'de bir geçici çözüm alabilirsiniz get_class($this)
.
class A {
public function create1() {
$class = get_class($this);
return new $class();
}
public function create2() {
return new static();
}
}
class B extends A {
}
$b = new B();
var_dump(get_class($b->create1()), get_class($b->create2()));
Sonuçlar:
string(1) "B"
string(1) "B"
clone
, ancak yalnızca özellikleri yeniden oluşturup ayarlayarak "kopyala" yönteminde kullanabilirsiniz . $copy = new static(); $copy->set($this->get()); return $copy;
self::
veya static::
etkileme. Nedense yokluğunda arasındaki seçim, doğal olarak meydana gelen böyle bir durum kötü uygulama gösterir düşünmek (ve bu yüzden olmalı neden herhangi bir neden görmüyorum) self::
ve static::
bunun içinde olduğu gibi statik olmayan yöntemler içinde tıpkı alakalı statik yöntemler. Yorumunuzu yanlış anladım mı yoksa bizden biri yanlış mı?
Başkalarının cevaplarına ek olarak:
static :: çalışma zamanı bilgileri kullanılarak hesaplanır.
Bu, static::
özellik değerleri nedeniyle bir sınıf özelliğinde kullanamayacağınız anlamına gelir :
Derleme zamanında değerlendirilebilmelidir ve çalışma zamanı bilgisine bağlı olmamalıdır.
class Foo {
public $name = static::class;
}
$Foo = new Foo;
echo $Foo->name; // Fatal error
kullanma self::
class Foo {
public $name = self::class;
}
$Foo = new Foo;
echo $Foo->name; // Foo
Yaptığım koddaki Önemli hata yorumunun hatanın nerede olduğunu göstermediğini, nesnenin yorumlarda belirtildiği gibi @Grapestain olarak başlatılmasından önce hatanın daha önce meydana geldiğini lütfen unutmayın.
public $name = static::class;
örnekte önerildiği gibi, 7. hatta değil 2. hatta atıldığını unutmayın . Hata der ki: "static :: class, derleme zamanı sınıf adı çözümlemesi için kullanılamaz"; bu, sorunun $ name alanına erişmeye çalıştığınız yerde değil, çok daha önce PHP sınıfının derlenmesinde olduğunu gösterir. İlk örnekte 7. satıra (veya 6) ulaşılamaz.