いくつかのPHPクラスをデバッグしようとしているときに、私はいくつかの動作に遭遇しました。これは、私の考えでは、本当に奇妙なことです。
以下の動作のデモンストレーションを作成しました。
class BaseClass {
public function baseMethod () {
echo (implode (' ', $this -> childMethod ()) . PHP_EOL);
}
}
class ChildClass extends BaseClass {
protected function childMethod () {
return array ('What', 'The', 'Actual', 'Fork!');
}
}
$a = new ChildClass ();
$a -> baseMethod ();
さて、私の考えでは、基本クラスは、抽象メソッドを宣言(または継承)するか、インターフェースを実装することによってサブクラスに強制するものを除いて、サブクラスについてまったく仮定を立てることができないはずです。ただし、上記のコードは実際には文字列を出力し、エラーをスローしません。
なんと実際のフォーク!
これは私には壊れた振る舞いのようです。基本クラスが宣言しない限り、abstract protected function childMethod();
それを呼び出すことはできませんね。
私はインターネットを精査して、これが予想される動作であることを示す何かを見つけようとしています。これまでのところ、私が見つけたのは、PHPのマニュアルから次のとおりです。
他のオブジェクトからの可視性
同じタイプのオブジェクトは、同じインスタンスでなくても、互いにプライベートメンバーと保護されたメンバーにアクセスできます。これは、これらのオブジェクト内で実装固有の詳細がすでにわかっているためです。
それで、私がここで目撃している振る舞いは正しいですか、それともこれはPHPのバグですか?それは私には間違っているように見えるので、確かに私が頼りにする行動ではありません。
参考までに、実際のコードで見つかった問題は、サブクラスがスーパークラスが呼び出そうとしているプライベートメソッドを宣言したことでした。スーパークラスはメソッドabstractを宣言しませんでした(宣言した場合は、少なくとも保護する必要がありました)。