Почему строгие стандарты PHP не жалуются на разницу в аргументах конструктора?

Обычно, когда у дочернего класса есть другие аргументы функции, чем у его родителя, 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(),

Пруф на 3в4л

Зачем?? Разве не так же плохо делать это для конструкторов?

(Я запускаю PHP 5.5.17 здесь, но, как вы можете видеть на 3v4l, он работает одинаково для всех PHP 5.)

0

Решение

Я не могу объяснить почему, но в документации PHP есть информация об этом:

В отличие от других методов, PHP не будет генерировать сообщение об ошибке уровня E_STRICT, когда __construct () переопределяется с параметрами, отличными от родительского метода __construct ().

Источник: http://php.net/manual/en/language.oop5.decon.php

3

Другие решения

Основная причина этого заключается в том, что когда вы создаете экземпляр класса, он вызывает ТОЛЬКО дочерний конструктор. Если вы хотите, чтобы родительский конструктор также вызывался, вы должны явно вызвать его, используя parent::__construct(), Предполагается, что дочерние классы будут создавать свои собственные конструкторы и реализовывать родительский класс по своему усмотрению.

Напротив, если (используя ваш пример) я хочу позвонить Boele->bla(), это потенциально сбивает с толку иметь две функции с одинаковыми именами с разными аргументами. Хуже того, нет простого способа позвонить Oele->bla() используя ребенка. Поэтому не рекомендуется переопределять родительскую функцию несовместимой функцией.

Также рассмотрим, сколько способов PHP имеет способ ограничения классов реализации (абстрактные и интерфейсы). В этих случаях вы должны реализовать их с одинаковыми аргументами, иначе вы получите ошибку.

1