добавление параметров к переопределенному методу E_STRICT

Появляется (PHP 5.3), что если вы переопределяете метод класса, это нормально вы можете добавить дополнительные параметры, если они имеют значения по умолчанию.

Например, рассмотрим класс:

class test1 { public function stuff() { echo "Hi"; } } 

Следующий класс расширяет «test1» и будет выдавать предупреждение E_STRICT.

 class test2 extends test1 { public function stuff($name) { echo "Hi $name"; } } 

Но следующее предупреждение не генерирует E_STRICT.

 class test3 extends test1 { public function stuff($name = "") { echo "Hi $name"; } } 

В то время как класс «test3» не создает предупреждение E_STRICT, у меня создалось впечатление, что PHP не позволяет подписывать методы перегруженный переопределены. Поэтому я должен спросить. Является ли мое наблюдение ошибкой / недостатком или на самом деле верный предполагаемое поведение?

Кроме того, если параметр аргумента по умолчанию в порядке, почему параметр аргумента не по умолчанию не подходит?

Если вы добавите параметр, не имеющий значения по умолчанию, к переопределенному методу, подкласс больше не удовлетворяет контракту, определенному суперклассом. Вы не можете правильно вызвать test2-> stuff (), потому что этот метод теперь ожидает параметр, но суперкласс говорит, что вы можете его назвать без него. Следовательно, предупреждение E_STRICT.

Если вы добавите параметр по умолчанию, тем не менее, вы все равно можете вызвать test3-> stuff () (из вашего примера) – как ожидает суперкласс – и, следовательно, контракт не будет нарушен. Фактически, добавив необязательный параметр, вы просто расширили его.

Это не ошибка и приемлемая практика программирования PHP.

Обратите внимание, что множественные переопределения могут вызвать programmer headaches хотя их следует избегать, где это возможно.

В качестве альтернативы я обычно либо имею один расширенный класс для переопределения для каждого класса, либо просто перегружает метод класса в самом фактическом классе.