abstract class Mother {
protected static $foo = null;
protected static $bar = null;
public function getFoo() { return static::$foo; }
public function getBar() { return static::$bar; }
public function setFoo($foo) { static::$foo = $foo; }
public function setBar($bar) { static::$bar = $bar; }
}
class Brother extends Mother {
protected static $foo = 'BROTHERS';
}
class Sister extends Mother {
protected static $foo = 'SISTERS';
}
$brother1 = new Brother();
$brother2 = new Brother();
$sister1 = new Sister();
$sister2 = new Sister();
$sister1->setBar('ONLY SISTERS'); // We set $bar = 'ONLY SISTERS' at sister1.
// We want only Sister instances to get this value...
// however Brother instances also get this value!
echo '<p>Brother 1: Foo="'.$brother1->getFoo().'", Bar="'.$brother1->getBar().'"</p>';
// Foo="BROTHERS", Bar="ONLY SISTERS"
echo '<p>Brother 2: Foo="'.$brother2->getFoo().'", Bar="'.$brother2->getBar().'"</p>';
// Foo="BROTHERS", Bar="ONLY SISTERS"
echo '<p>Sister 1: Foo="'.$sister1->getFoo().'", Bar="'.$sister1->getBar().'"</p>';
// Foo="SISTERS", Bar="ONLY SISTERS"
echo '<p>Sister 2: Foo="'.$sister2->getFoo().'", Bar="'.$sister2->getBar().'"</p>';
// Foo="SISTERS", Bar="ONLY SISTERS"
static :: $ barがすべての子(Brother、Sister)で明示的に再定義されていない場合、親(Mother)それを再定義しなかった人のために)。PHP:静的変数のスコープを特定のクラスに限定する
質問:static :: $ barを再定義しなかった子供が新しい値を受け取るのを防ぐ方法はありますか?言い換えれば、参照されたクラスのみが新しい値を取得する方法、static :: $ barがすべての子で明示的に再定義されない場合でもEVEN?
を私はこれを達成するための唯一のオプションを参照してください。姉妹クラスのgetBarメソッドとsetBarメソッドを上書きする必要があります。 setBarメソッドは$ this-> barに書き込み、getBarは$ this-> barが設定されているかどうかをチェックし、そうでなければparent :: $ barから取得します。 – Dan
オブジェクトインスタンスがあるときにこれらの静的な理由がありますか? –
@ダンあなたはおそらく正しいでしょう。別のオプションは、すべての子にstatic :: $ barを再宣言することです。問題は、プログラマにこれを強制する方法がないことです。 – mae