アップグレードする前に、既存のコードを 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';
}
}
しかし、関数は明らかに引数の型を受け入れないため、修正はリスコフの置換原則に準拠していますか? そうでない場合、必要なことを実行し、同じタイプの 2 つのオブジェクトを比較し、適切な OOD 原則に準拠する継承可能な関数をコーディングするにはどうすればよいでしょうか?