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