Я тестирую свой существующий код на PHP5.4 перед обновлением. Я обнаружил, что следующий код больше не работает, потому что PHP ужесточил свою модель наследования. Из-за этого ужесточения я читал про SOLID, а конкретно принцип подстановки Лисков(я программист-самоучка), чтобы я мог улучшать свой код и не страдать от будущие "затяжки".
interface IComparable {
public function equals(self $other);
}
class A implements IComparable{
protected $var;
public function __construct($v){
$this->var=$v;
}
public function equals(self $other){
return ($this->var == $other->var) ? 'equal' : 'different';
}
}
$a1= new A(7);
$a2= new A(5);
$a3= new A(5);
echo $a1->equals($a2),"\n";
echo $a2->equals($a3),"\n";
Неустранимая ошибка PHP: объявление A::equals() должно быть совместимо с IComparable::equals(IComparable $other)
Я могу избежать ошибки php5.4, если напишу код таким образом:
interface IComparable {
public function equals($other);
}
class A implements IComparable{
protected $var;
public function __construct($v){
$this->var=$v;
}
public function equals($other){
if(get_class($other) != get_class($this)) return false;
return ($this->var == $other->var) ? 'equal' : 'different';
}
}
но соответствует ли исправление принципу подстановки Лисков, так как функция очевидно не будет принимать любой тип аргумента? И если это не так, как я могу написать наследуемую функцию, которая будет делать то, что мне нужно — сравнивать 2 объекта одного типа — и соответствовать хорошим принципам OOD?