1

これはおそらく基本的な質問ですが、このチュートリアルに従っていると、ある時点でコードは次のようになります。

<?php

class person
{
    public $name;
    public $height;
    protected $social_security_no;
    private $pin_number = 3242;

    public function __construct($person_name)
    {
        $this->name = $person_name;
    }
    public function set_name($new_name)
    {
        $this->name = $new_name;
    }

    protected function get_name()
    {
        return $this->name;
    }

    public function get_pin_number_public()
    {
        $this->pub_pin = $this->get_pin_number();
        return $this->pub_pin;
    }

    private function get_pin_number()
    {
        return $this->pin_number;
    }

}

class employee extends person
{

    public function __construct($person_name)
    {
        $this->name = $person_name;
    }

    protected function get_name()
    {
        return $this->name;
    }
}

ただし、これを使用すると

<?php include "class_lib.php";?>
    </head>
    <body id="theBody">
    <div>

<?php
$maria = new person("Default");

$dave = new employee("David Knowler");
echo $dave->get_name();
?>

このエラーが発生します

致命的なエラー: C:\Users\danny\Documents\Workspace\test\index.php の 13 行目のコンテキスト '' から保護されたメソッド employee::get_name() を呼び出します

問題は、従業員クラスの get_name() 関数に protected を追加したときのようですが、これがチュートリアルでオーバーライドする好ましい方法であるように思えます。何か案は?

4

3 に答える 3

3

問題は、保護されたメソッドをオーバーライドできないことではなく、クラスの外部から保護されたメソッドを呼び出していることです。

クラスがインスタンス化された後、パブリック メソッドを呼び出すことができます。パブリック メソッドは次に呼び出すことができget_name()、コードが期待どおりに機能することがわかります。

例えば:

class employee extends person {

    function __construct($person_name){
        $this->name = $person_name;
    }

    protected function get_name() {
        return $this->name;
    }

    public function name()
    {
        return $this->get_name();
    }
}

$dave = new employee("David Knowler");
echo $dave->name();

get_name()あなたの例では、おそらく公開するのが最善でしょう。

于 2013-10-09T15:56:44.710 に答える
2

これら 2 つのクラスの外部ではなく、個人クラスまたは従業員クラス内で get_name() にアクセスできます。

保護された可視性を確認する

http://php.net/manual/en/language.oop5.visibility.php

于 2013-10-09T15:56:54.953 に答える
2

「従業員クラスの関数に追加protectedするときに問題があるようですget_name()」-これがあなたの答えです。保護されたメソッドは、「外部から」ではなく、まったく同じクラスまたはサブクラスからのみ呼び出すことができます。この方法で使用する場合は、メソッドをパブリックにする必要があります。

于 2013-10-09T15:52:45.930 に答える