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"
Таким образом, если статический :: $ бар явно не переопределен для каждого дочернего элемента (Брат, Сестра), их родитель (Мать) установит для них значение (или, по крайней мере, для тех, кто не переопределял его).PHP: Ограничение области статической переменной до определенного класса
Вопрос: Есть ли способ предотвратить детей, которые не переопределили статические :: $ bar от получения нового значения? Другими словами, как убедиться, что только связанный класс получает новое значение, ДАЖЕ, если static \ $ bar явно не переопределяется в каждом дочернем?
Я вижу только один вариант для достижения этой цели. Вы должны перезаписать методы getBar и setBar в родном классе. Метод setBar записывает в $ this-> bar, и getBar проверяет, установлен ли $ this-> bar и извлекается из parent :: $ bar в противном случае. – Dan
Есть ли причина иметь эти статические, когда у вас есть экземпляр объекта? –
@Dan Возможно, вы правы. Другой вариант - повторно объявить static :: $ bar в каждом дочернем элементе. Проблема в том, что не существует способа заставить программиста сделать это. – mae