Ben bu konuda konuşurken ne özel çözüm emin değilim, ben çalışabilir epeyce düşünebilirsiniz. Ben şahsen herhangi bir kod, bu kullanmak olmaz. Sana Is it possible to overuse late static binding in PHP? bir göz atın tavsiye ve başarmak umut ne yapmak için daha iyi bir yolu varsa yeniden düşünmek istiyorum.
Ayrıca ben sadece burada yazdığım gibi benim kod tamamen denenmemiş olduğunu unutmayın.
Method 1: Always use an array to figure
Diğer tüm yöntemler, bu bir dayanmaktadır. Eğer statik özelliğini kullanın whereever, sen sınıfını tespit etmek ve bunu elde etmek için kodu eklemek. Eğer başka bir yerde özelliğini kullanmayı planlıyorsanız asla Ben sadece bu düşünecektim.
$class = get_called_class();
if(isset(self::$_names[$class])) {
return self::$_names[$class];
}
else {
return static::NAME_DEFAULT;
}
Method 2: Use a getter/setting methods
Eğer birden fazla noktada kullanılan sahip planlıyorsanız, bu yöntem daha iyi olurdu. Bazı tekiz desenleri benzer bir yöntem kullanır.
<?php
class SomeParent {
const NAME_DEFAULT = 'Whatever defaults here';
private static $_names = array();
static function getName($property) {
$class = get_called_class();
if(isset(self::$_names[$class])) {
$name self::$_names[$class];
}
else {
$name = "Kandy"; // use some sort of default value
}
}
static function setName($value) {
$class = get_called_class();
self::$_names[$class] = $value;
}
}
Method 3: __callStatic
Bu kadar en uygun yöntemdir. Eğer (__get ve __ set statik kullanılamaz) kullanmak için bir nesne örneği olması gerekir ancak. Aynı zamanda, (diğer iki daha yavaş) yavaş bir yöntemdir. Ben zaten statik özelliklerini kullanarak konum beri bu zaten olmayan bir seçenek olduğunu tahmin ediyorum. (Bu yöntem sizin için çalışır Eğer statik özelliklerini kullanabilirsiniz olmasaydı, muhtemelen daha iyi olurdu)
<?php
class SomeParent {
const NAME_DEFAULT = 'Whatever defaults here';
private static $_names = array();
function __get($property) {
if($property == 'name') {
$class = get_called_class();
if(isset(self::$_names[$class])) {
return self::$_names[$class];
}
else {
return static::NAME_DEFAULT;
}
}
// should probably trigger some sort of error here
}
function __set($property, $value) {
if($property == 'name') {
$class = get_called_class();
self::$_names[$class] = $value;
}
else {
static::$property = $value;
}
}
}