1

W. Jason Gilmore の本「Beginning PHP and MYSQL」を読んでいて、意味のわからない部分に出くわしました。これは、OOP のアクセサーとミューテーターに関するセクションにありました。

class Employee
{
    var $name;
    var $city;
    protected $wage;

    function __get($propName)
    {
        echo "__get called!<br />";
        $vars = array("name","city");
        if (in_array($propName, $vars))
        {
            return $this->$propName;
        }else {
            return "No such variable!";
        }
    }


}

$employee = new Employee();
$employee->name = "Mario";

echo $employee->name."<br />";
echo $employee->age;

これは以下を返します。

マリオ__呼んで!そのような変数はありません!

これで最初に発生した問題は、name プロパティが「Mario」に設定されている場合、アクセサ メソッドが実行されないことです。少し検索したところ、アクセスできないプロパティからデータを読み取るときにのみ __get が実行されるように見えますが、これは決してそうではありません。本に記載されています。これが __get メソッドが実行されない理由ですか?

2 番目の質問は、「if」ステートメントに関するものでした。__get が本当にアクセスできないプロパティから読み取ろうとしたときにのみ実行されるのであれば、設定されている変数の配列にプロパティが既にあるかどうかを確認する "if" を内部に持つのはなぜですか? きっとそうではないでしょう、あるいはあなたは「もし」にたどり着かなかったでしょうね?

4

1 に答える 1

1

魔法の __get および __set メソッドは、呼び出し元のスコープからプロパティにアクセスできない (存在しないか、保護されているか非公開である) 場合にのみ呼び出されます。この場合、プロパティが存在し、公開されているため、セッター呼び出しを実行していません。

この例を機能させるには、次のことを行う必要があります。

class Employee
{
    protected $name;
    protected $city;
    protected $wage;

    function __set ($property, $value){
        $this->$property = $value;
    }
    function __get($propName)
    {
        echo "__get called!<br />";
        $vars = array("name","city");
        if (in_array($propName, $vars))
        {
            return $this->$propName;
        }else {
            return "No such variable!";
        }
    }


}

$employee = new Employee();
$employee->name = "Mario";

echo $employee->name."<br />";
echo $employee->age;

最初に、スコープが保護されているプロパティを呼び出しスコープから効果的に隠します。次に、割り当て ( $employee->name = "Mario";) を許可するために、マジック セッターが追加されまし__setた。

于 2013-07-18T15:09:44.987 に答える