表面的なレベルでは、継承はコードのマージのように機能します。継承されたメソッドは、クラスにネイティブであるかのように子クラスの一部です。
class A {
public function foo() {
echo 'foo';
}
public function bar() {
echo 'bar';
}
}
class B extends A { }
すべての意図と目的のために、これは書くことと同等です:
class B {
public function foo() {
echo 'foo';
}
public function bar() {
echo 'bar';
}
}
クラスB
には関数がfoo
ありbar
、あたかもそれらが宣言の一部であるかのように機能します。
子クラスのメソッドをオーバーライドすると、特定の実装が別の実装に置き換えられます。
class B extends A {
public function bar() {
echo 'baz';
}
}
これは、次のようB
に宣言されたかのようです。
class B {
public function foo() {
echo 'foo';
}
public function bar() {
echo 'baz';
}
}
1つの例外を除いて、メソッドの親の実装は、parent
キーワードを使用して利用できます。コードが実行されるコンテキストは変更されず、親のメソッドの実装が使用されるだけです。
class B extends A {
public function bar() { public function bar() {
parent::bar(); ---> echo 'bar';
} }
}
これは、の現在のインスタンスと同じコンテキストで機能しB
、親の古いコードをエーテルから引き出すだけです。
親のメソッドで別のメソッドを呼び出すと、親クラスのコンテキストではなく、子のコンテキストで実行されます。親をインスタンス化していないため、子を使用しています。プロパティでデモンストレーションするには(メソッドでも同じように機能します):
class A {
protected $value = 'bar';
public function bar() {
echo $this->value;
}
}
class B extends A {
protected $value = 'baz';
public function bar() {
parent::bar(); // outputs "baz"
echo $this->value; // outputs "baz"
}
}
そのため、問題の解決策はありません。「親のコンテキスト」でメソッドを呼び出すことはできません。現在のコンテキストで親のコードを呼び出すことができます。それだけです。作成しているのは単純なループです。コードが継承されているかどうかは関係なく、すべて同じコンテキストで機能します。
ループ内のメソッドを呼び出さないように、そのクラスを再設計する必要があります。