Появляется (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
хотя их следует избегать, где это возможно.
В качестве альтернативы я обычно либо имею один расширенный класс для переопределения для каждого класса, либо просто перегружает метод класса в самом фактическом классе.