3

変更できないクラスの変数に「リスナー」を書き込もうとしています。問題のクラスを拡張し、リッスンするプロパティを設定解除してから、__set を使用してその変数への書き込みを傍受します。その時点で以前のバージョンと比較し、変更があれば報告します。

class A {
    var $variable;

    ...
}

class B extends A {
    var $new_variable

    function __construct() {
        parent::__construct();
        unset($this->variable);
    }

    function __set($thing, $data) {
        if ($thing == 'variable') {
            // Report change
            // Set $new_variable so we can use __get on it
        }
    }

    public function __get($var) {
        if (isset($this->$var)) {
            // Get as normal.
            return $this->$var;
        } elseif ($var == 'variable' && isset($this->new_variable)) {
            return $this->new_variable;
        }
    }

    ...
}

これは、問題のクラスを拡張クラスを介してではなく直接変更し、変数の宣言を削除してセッター メソッドとゲッター メソッドを導入すると機能します。問題は、上記のパターンを使用すると、 unset() 呼び出しが親クラスから継承された変数を実際に削除していないように見えるため、__set メソッドが変数の値をインターセプトできなくなることです。

これまでのところ、これが変数の変更を監視できる唯一の方法のように思えますが、フレームワークのコアをハックしたくはありません。便利な作業 (パーサー) を検査するだけです。これを機能させる可能性、またはこの問題に取り組む別の方法はありますか?

4

1 に答える 1

2

うーん、これは奇妙です。次のコードは正常に動作します。

class A 
{
    var $variable;
}

class B extends A 
{
    var $new_variable;

    function __construct() 
    {
        unset($this->variable);
    }

    function __set($thing, $data) 
    {
        if ($thing == 'variable') 
        {
        echo "\nThe variable value is '" . $data . "'\n";
        }
    }
}

$b = new B();
$b->variable = 'Intercepted'; //Output: The variable value is 'Intercepted'
$b->new_variable = 'Not intercepted'; // No output

このコードが必要な機能を果たすかどうか教えてください。そうでない場合は、代わりに何が必要になりますか?

HTH

于 2013-02-07T15:00:03.187 に答える