Этот код всегда выдает предупреждение о несовместимой подписи с версии 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.