добавление параметров в переопределенный метод E_STRICT наблюдения - PullRequest
9 голосов
/ 15 июля 2011

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

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

Ответы [ 2 ]

5 голосов
/ 23 февраля 2014

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

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

0 голосов
/ 22 августа 2013

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

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

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

...