それがどのような具体的な回避策について話していたのかはわかりませんが、機能する可能性のあるかなりの数の回避策を考えることができます. 私は個人的にこれらをどのコードでも使用しません。PHP で遅延静的バインディングを過剰に使用することは可能ですか? をご覧になることをお勧めします。そして、達成したいことを行うためのより良い方法があるかどうかを再考してください。
また、ここに書いたので、私のコードは完全にテストされていないことに注意してください。
方法 1: 常に配列を使用して計算する
他のすべてのメソッドは、このメソッドに基づいています。static プロパティを使用する場合は常に、クラスを検出して取得するコードを挿入します。他の場所でプロパティを使用する予定がない場合にのみ、これを検討します。
$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 は静的に使用できません)。また、このメソッドは最も低速です (他の 2 つよりもはるかに低速です)。あなたはすでに静的プロパティを使用しているので、これはすでにオプションではないと推測しています。(この方法がうまくいく場合は、静的プロパティを使用しない方がよいでしょう)
<?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;
}
}
}