2

次のクラス階層を持つ:

class TheParent{

    public function parse(){
        $this->validate();
    }

}

class TheChild extends TheParent{

    private function validate(){
        echo 'Valid!!';
    }
}

$child= new TheChild();
$child->parse();

これが機能する一連のステップは何ですか?

問題は、そのコードを実行すると、次のエラーが発生することです。

Fatal error: Call to private method TheChild::validate() from context 'TheParent' on line 4

からTheChild継承するのは、のインスタンスを参照するために呼び出されるTheParentべきではないので、 ?に表示されます。$thisparse()$childvalidate()parse()

注:
いくつかの調査を行った後、この問題の解決策は、PHPマニュアルのこのコメントに従ってvalidate()関数を作成することを発見しましたが、この場合になぜ機能するのか完全には理解していません。 protected

abstract protected2番目の解決策は、親でメソッドを作成し、validate()それを子でオーバーライドすることです(これは冗長になります)protected。子のメソッドは親からアクセスできるため、最初の解決策にオーバーライドしますか?!!

この場合、継承がどのように機能するかを誰かに説明してもらえますか?

4

4 に答える 4

17

他のポスターは、それらにアクセスするために方法を保護する必要があることをすでに指摘しています。

コード内でもう1つ変更する必要があると思います。基本クラスparentは、子クラスで定義されているメソッドに依存しています。それは悪いプログラミングです。次のようにコードを変更します。

abstract class TheParent{

    public function parse(){
        $this->validate();
    }

    abstract function validate();

}

class TheChild extends TheParent{

    protected function validate(){
        echo 'Valid!!';
    }
}

$child= new TheChild();
$child->parse(); 

抽象関数を作成すると、そのようなクラスから継承するために抽象クラスのすべての抽象関数を実装する必要があるため、子クラスが確実に関数を持つようになります。validate

于 2012-10-17T13:02:12.270 に答える
4

継承の考え方は正しいですが、可視性だけではありません。

Protectedは、クラスと継承クラスおよび親クラスで使用できます。privateは、定義された実際のクラスでのみ使用できます。

于 2012-10-17T12:54:00.267 に答える
2

プライベートには、親クラスも子クラスも定義しないクラスからのみアクセスできます。

代わりに保護を使用してください:

class TheParent{

    public function parse(){
        $this->validate();
    }

}

class TheChild extends TheParent{

    protected function validate(){
        echo 'Valid!!';
    }
}

$child= new TheChild();
$child->parse();
于 2012-10-17T12:55:57.503 に答える
0

PHPDOCから

他のオブジェクトからの可視性

同じタイプのオブジェクトは、同じインスタンスでなくても、互いにプライベートメンバーと保護されたメンバーにアクセスできます。これは、これらのオブジェクト内で実装固有の詳細がすでにわかっているためです。

class which defines プライベートには、またはSame object type例でのみアクセスできます

class TheChild {
    public function parse(TheChild $new) {
        $this->validate();
        $new->validate(); // <------------ Calling Private Method of $new
    }
    private function validate() {
        echo 'Valid!!';
    }
}

$child = new TheChild();
$child->parse(new TheChild());

出力

有効!!有効!!

于 2012-10-17T13:02:01.943 に答える