Различное количество параметров в функции переопределения - PullRequest
0 голосов
/ 28 февраля 2019

Я хочу спросить, как включить полный отчет об ошибках, E_ALL и ошибки запуска в php.ini в моем случае не влияют.

Мой код:

class A
{
   function funcA(arg1=null, arg2=null, arg3=false, arg4=null) {}
}

class B extends A
{
   function funcB() {}
}

class C extends B
{
   function funcA(arg1=null, arg2=null, arg3=false) {}
}

Сphp 7.0 было разрешено и работало, после обновления до php 7.2.15 происходит какой-то сбой php, выполнение скрипта останавливается, ошибок в журналах ошибок нет.В php 7.2 должно быть такое же количество параметров метода, как и в родительском классе, для меня это не проблема, но проблема в том, что у меня нет отзывов от php об этой ошибке.У вас есть идеи, почему нет ошибки или исключения?Я использую разработку php.ini со включенным отображением всех ошибок.

1 Ответ

0 голосов
/ 28 февраля 2019

Этот код всегда выдает предупреждение о несовместимой подписи с версии 7.0.33 до 7.3.

Это можно подтвердить здесь: https://3v4l.org/Ifmbk

На самом деле, вы непреднамеренно нарушаете LПравило SOLID , что означает Принцип подстановки Лискова :

Объекты в программе должны заменяться экземплярами их подтипов без изменения правильностиэта программа.

Экземпляры C и A в вашем примере не являются буквально взаимозаменяемыми, даже имея необязательные аргументы в сигнатуре.

Тем не менее, у вас есть по крайней мере двапараметры и оба они требуют изменения дизайна и самого предупреждения, подтверждающего наличие запаха.

Уберите наследство, если действительно мало общих функций, и добавьте композицию:

class B
{
   /**
    * A
    */ 
   private $a;

   public function __construct(A $a) {
       $this->a = $a;
   }
}

Или разделить функциональность на разные методы и иметь более удобный интерфейс для приема AbcInterface в других местах и ​​валидациях.тип экземпляра, который вы получили в реальной реализации:

interface AbcInterface
{
    public function B();
}

class A implements AbcInterface
{
    public function funcA($arg1=null, $arg2=null, $arg3=false, $arg4=null)
    {
    }

    public function funcAWithLessArgs($arg1=null, $arg2=null, $arg3=false)
    {
    }
}

На самом деле, здесь вам нужно перегрузка функции , которой с самого начала не существует в экосистеме PHP.

...