ホームページ  >  記事  >  バックエンド開発  >  PHP で親クラスがサブクラスのメソッドを呼び出す

PHP で親クラスがサブクラスのメソッドを呼び出す

WBOY
WBOYオリジナル
2016-06-23 13:15:512420ブラウズ

朝食を食べているときにここで質問を見ました。これは少し興味深いものです。一般に、親クラスがサブクラスのメソッドを呼び出すことは推奨されませんが、メソッドを多様化したい場合は理解できます。

この場合、強い抑制が必要です。そうしないとバグが発生しやすくなります。継承関係では、親クラスはサブクラスを知らないため、この状況はインターフェイスまたは抽象クラスを使用して制限する必要があります。

最初にコードを見てください

<?phpclass A{    public function run()    {        //我在这里把对象打印出来,方便理解        var_dump($this);        $this->say();    }}class B extends A{    protected function say()    {        echo 'B-say';    }}$b = new B();$b->run();//结果:object(B)#1 (0) { } B-say

親クラスで $this がすでに B を指しているのがわかりましたか。

継承を分解してみると、実際には B は次のようになりました:

<?phpclass B{    public function run()    {        //我在这里把对象打印出来,方便理解        var_dump($this);        $this->say();    }    protected function say()    {        echo 'B-say';    }}$b = new B();$b->run();//结果:object(B)#1 (0) { } B-say

B は A のメソッドを継承するので、親クラス A がサブクラス B のメソッドを呼び出すことに成功したようです。

質問で述べたように、say() メソッドがプライベートになった後、呼び出しは失敗します。これがプライベート スコープの役割です。

run() 継承の本質を見てみましょう。

分解されたコードでは、確かにクラス B に run() がありますが、この run() はその親 A に属します。これは「借用」することしかできず、「所有権」は B に属するため、run() は次のようになります。呼ばれる時間が来たら、お父さんAのところに走って使わなければなりません。

注意、お父さんAが使用する場合、 使用環境はAです

しかしプライベートは、私が変更したものは、現在のクラスでのみ使用できます、そして私なしでは誰もそれを使用できないと言いました。

それで、エラーを報告しました。

継承呼び出し後の分解コード:

<?phpclass A{    public function run()    {        $b = new B();        $b->say();//在外部new B对象调用private方法,失败    }}class B extends A{    private function say()    {        echo 'B-say';    }}$b = new B();$b->run();//结果:PHP Fatal error

独自の run メソッドが必要な場合は、それを書き直す必要があります。

<?phpclass A{    public function run()    {        var_dump($this);        $this->say();    }}class B extends A{    public function run()    {        $this->say();    }    private function say()    {        echo 'B-say';    }}$b = new B();$b->run();//结果:B-say

クリックして QR コードを生成

この記事は Cheng Xiaobai によって作成されました

この記事は自由に複製および引用できますが、著者の署名と記事の出典の明示が必要です。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。