Обычно, когда у дочернего класса есть другие аргументы функции, чем у его родителя, PHP Strict Standards позволяет вам знать:
Строгие стандарты: объявление Boele :: bla () должно быть совместимо с Oele :: bla ($ one, Exception $ two) в foo.php
Это ничего не ломает, но дает понять, что это не круто. Согласен.
Тем не менее, конструкторы, кажется, получают специальную обработку:
class Oele {
function __construct($one, Exception $two) {}
function bla($one, Exception $two) {}
}
class Boele extends Oele {
function __construct(Exception $two) {}
function bla(Exception $two) {}
}
__construct()
а также bla()
методы различаются как в родительском, так и в дочернем процессах, но PHP уведомляет bla()
, не о __construct()
,
Зачем?? Разве не так же плохо делать это для конструкторов?
(Я запускаю PHP 5.5.17 здесь, но, как вы можете видеть на 3v4l, он работает одинаково для всех PHP 5.)
Я не могу объяснить почему, но в документации PHP есть информация об этом:
В отличие от других методов, PHP не будет генерировать сообщение об ошибке уровня E_STRICT, когда __construct () переопределяется с параметрами, отличными от родительского метода __construct ().
Основная причина этого заключается в том, что когда вы создаете экземпляр класса, он вызывает ТОЛЬКО дочерний конструктор. Если вы хотите, чтобы родительский конструктор также вызывался, вы должны явно вызвать его, используя parent::__construct()
, Предполагается, что дочерние классы будут создавать свои собственные конструкторы и реализовывать родительский класс по своему усмотрению.
Напротив, если (используя ваш пример) я хочу позвонить Boele->bla()
, это потенциально сбивает с толку иметь две функции с одинаковыми именами с разными аргументами. Хуже того, нет простого способа позвонить Oele->bla()
используя ребенка. Поэтому не рекомендуется переопределять родительскую функцию несовместимой функцией.
Также рассмотрим, сколько способов PHP имеет способ ограничения классов реализации (абстрактные и интерфейсы). В этих случаях вы должны реализовать их с одинаковыми аргументами, иначе вы получите ошибку.