5

特定のオブジェクトの特定のプロパティが変更される場所を見つけようとしています。PHPの非常に動的な性質($o->$prop = $valおよびそのような)のために、これを単純なコード分析で行うことは事実上不可能です。デバッグセッションを開始し、プロパティが変更された行で中断する方法はありますか?__set(条件付き呼び出しを使用してクラスにマジックを追加するとxdebug_break()、単純なケースで役立つ場合がありますが、クラスまたはその祖先の1つにすでにマジックセッターがある場合、非常に複雑になる可能性があるため、これも適切な解決策ではありません。)

4

2 に答える 2

11

xdebugのドキュメントによると、変数の変更を中断する方法があるはずです。 http://xdebug.org/docs-dbgp.php#breakpoints

ウォッチ:式の引数で定義された変数またはアドレスの書き込みを中断します

ただし、ソースコードは、ドキュメントが実際の機能よりも進んでいることを示しています: https ://github.com/xdebug/xdebug/blob/master/xdebug_handler_dbgp.c#L875

if (strcmp(CMD_OPTION('t'), "watch") == 0) {
        RETURN_RESULT(XG(status), XG(reason), XDEBUG_ERROR_BREAKPOINT_TYPE_NOT_SUPPORTED);
    }

リポジトリ内の他の場所で文字列「watch」を実際に見つけることができなかったので、現在サポートされていないことを前提としています。

Xdebugのバグトラッカーにバグがあるようです。

http://bugs.xdebug.org/view.php?id=514

于 2014-04-01T06:05:11.187 に答える
7

デバッグしようとしているプロパティをとして宣言しprivate、メソッドを作成します__set。その中で、あなたはあなたの答えを見つけることができるでしょう。

class subject extends something {
    private $field;

    public function __set($key, $value) {
        if ($key == 'field') {
            debug_print_backtrace(); exit;
        }

        if (method_exists(get_parent_class($this), '__set')) {
            return parent::__set($key, $value);
        }

        return $this->$key = $value;
    }
}

編集:これはゲッターとセッターのもう1つの驚異的な理由です:)

于 2013-02-15T18:19:30.093 に答える