在升级之前,我正在 PHP5.4 上测试我现有的代码。我发现以下代码不再有效,因为 PHP 加强了它的继承模型。由于这种收紧,我一直在阅读SOLID,特别是Liskov 的替换原则(我是一名自学成才的程序员),这样我就可以改进我的代码,而不会受到未来的“收紧”的影响。
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 5.3 结果:
- 不同的
- 平等的
php 5.4 结果:
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';
}
}
但是该修复是否符合 Liskov 的替换原则,因为该函数显然不接受任何参数类型?如果没有,我如何编写一个可继承的函数来满足我的需要——比较相同类型的 2 个对象——并遵守良好的 OOD 原则?