1

__set()__get()マジック メソッドを使用した単純なクラスの例が 2 つあります。関数で保護されたプロパティにアクセスしようとすると、1 つは致命的なエラーをスローし、もう 1 つは致命的なエラーをスローしませんunset()

例 1 では、保護されたプロパティにアンダースコアで始まる名前を付け、フレンドリ名を介してアクセスできるようにし、メソッド__set()__get()メソッドの先頭にアンダースコアを追加しています。(アンダースコアなしでプロパティを効果的に公開します)。

例 2 では、名前をアンダースコアで開始せ__set()、メソッドとメソッドで名前を介して直接アクセスできるようにしてい__get()ます。

質問

1)例 2 では致命的なエラーがスローされるのに、例 1 では致命的なエラーがスローされないのはなぜですか? 両方がエラーをスローするか、どちらもエラーをスローしないことを期待します。

2) また、例 1 で実際にプロパティが設定解除されないのはなぜですか? unset()関数が呼び出された後、プロパティに値が含まれていないと思います。

例 1

class Example {

    protected $_my_property;

    function __get($name) {
        echo '<h4>__get() was triggered!</h4>';
        $name = '_' . $name;
        if (property_exists($this, $name)) {
            return $this->$name;
        }
        else {
            trigger_error("Undefined property in __get(): $name");
            return NULL;
        }
    }

    function __set($name, $value) {
        echo '<h4>__set() was triggered!</h4>';
        $name = '_' . $name;
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return;
        }
        else {
            trigger_error("Undefined property in __set(): {$name}");
        }
    }

}

$myExample = new Example();
$myExample->my_property = 'my_property now has a value';
echo $myExample->my_property;
unset($myExample->my_property);
echo "Did I unset my property?: {$myExample->my_property}";

例 2

class Example {

    protected $my_property;

    function __get($name) {
        echo '<h4>__get() was triggered!</h4>';
        if (property_exists($this, $name)) {
            return $this->$name;
        }
        else {
            trigger_error("Undefined property in __get(): $name");
            return NULL;
        }
    }

    function __set($name, $value) {
        echo '<h4>__set() was triggered!</h4>';
        if (property_exists($this, $name)) {
            $this->$name = $value;
            return;
        }
        else {
            trigger_error("Undefined property in __set(): {$name}");
        }
    }

}

$myExample = new Example();
$myExample->my_property = 'my_property now has a value';
echo $myExample->my_property;
unset($myExample->my_property);
echo "Did I unset my property?: {$myExample->my_property}";

補足として、これは私の実際のプロジェクトで見られる動作を示す単純な例にすぎません。ありがとう!

4

1 に答える 1