Я не уверен, о каком конкретном обходном пути идет речь, я могу вспомнить немало, которые могут сработать. Я лично не использовал бы их в любом коде. Я бы порекомендовал вам взглянуть Можно ли чрезмерно использовать позднее статическое связывание в PHP? и переосмыслить, если есть лучший способ сделать то, что вы надеетесь достичь.
Также имейте в виду, что мой код полностью не проверен, поскольку я написал его здесь.
Способ 1: всегда использовать массив для рисунка
Все остальные методы основаны на этом. Где бы вы ни использовали статическое свойство, вы вставляете код, чтобы определить класс и получить его. Я хотел бы рассмотреть это, только если вы никогда не планируете использовать собственность где-либо еще.
$class = get_called_class();
if(isset(self::$_names[$class])) {
return self::$_names[$class];
}
else {
return static::NAME_DEFAULT;
}
Метод 2: Использование методов получения / настройки
Если вы планируете использовать его более чем в одном месте, этот метод будет лучше. Некоторые одноэлементные паттерны используют аналогичный метод.
<?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;
}
}
Метод 3: __callStatic
Это, безусловно, самый удобный метод. Однако для его использования необходим экземпляр объекта (__get и __set не могут использоваться статически). Это также самый медленный метод (намного медленнее, чем два других). Я предполагаю, что, поскольку вы уже используете статические свойства, это уже не вариант. (Если этот метод работает для вас, было бы лучше, если бы вы не использовали статические свойства)
<?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;
}
}
}