Взгляните на этот пример и обратите внимание на указанные выходы.
<?php
class Mommy
{
protected static $_data = "Mommy Data";
public static function init( $data )
{
static::$_data = $data;
}
public static function showData()
{
echo static::$_data . "<br>";
}
}
class Brother extends Mommy
{
}
class Sister extends Mommy
{
}
Brother::init( "Brother Data" );
Sister::init( "Sister Data" );
Brother::showData(); // Outputs: Sister Data
Sister::showData(); // Outputs: Sister Data
?>
Насколько я понимаю, использование ключевого слова static будет относиться к дочернему классу, но, очевидно, оно волшебным образом применяется к родительскому классу, когда оно отсутствует в дочернем классе. (Это своего рода опасное поведение для PHP, подробнее об этом ниже.)
У меня есть две следующие причины, по которым я хочу это сделать:
- Мне не нужна избыточность определения всех свойств во всех дочерних классах.
- Я хочу, чтобы свойства были определены как значения по умолчанию в родительском классе, и я хочу, чтобы определение дочернего класса могло переопределять эти свойства везде, где это необходимо. Дочерний класс должен исключать свойства всякий раз, когда предполагаются значения по умолчанию, поэтому я не определяю свойства в дочерних классах в приведенном выше примере.
Однако, если мы хотим переопределить свойство во время выполнения (через метод init), оно переопределит его для родительского класса! С этого момента дочерние классы, инициализированные ранее (как в случае с Brother), неожиданно изменяются для вас.
По-видимому, это результат того, что дочерние классы не имеют собственной копии статического свойства, когда оно явно не определено внутри дочернего класса, но вместо того, чтобы выдавать ошибку, он переключает поведение static на доступ к родителю. Следовательно, существует ли способ, которым родительский класс мог бы динамически создавать свойство, принадлежащее дочернему классу, не появляясь внутри определения дочернего класса? Таким образом, дочерний класс мог бы иметь свою собственную копию static свойство и ключевое слово static могут ссылаться на него должным образом, и его можно записать с учетом значений по умолчанию родительского свойства.
Или есть другое решение, хорошее, плохое или уродливое?