Php Xdebug中属性更改时中断

Php Xdebug中属性更改时中断,php,xdebug,Php,Xdebug,我试图找出某个对象的某个属性在哪里被修改。由于PHP的高度动态性($o->$prop=$val等等),这实际上不可能通过简单的代码分析来实现。是否有方法启动调试会话并在修改属性的行中断?(在简单的情况下,向类添加带有条件调用的magic\uU setxdebug\u break()可能会有所帮助,但是如果类或其祖先之一已经有了magic setter,它可能会变得非常复杂,因此这也不是一个好的解决方案。)将您尝试调试的属性声明为private,并创建一个\u集方法。在这里面,你将能够找到你的答案

我试图找出某个对象的某个属性在哪里被修改。由于PHP的高度动态性(
$o->$prop=$val
等等),这实际上不可能通过简单的代码分析来实现。是否有方法启动调试会话并在修改属性的行中断?(在简单的情况下,向类添加带有条件调用的magic
\uU set
xdebug\u break()可能会有所帮助,但是如果类或其祖先之一已经有了magic setter,它可能会变得非常复杂,因此这也不是一个好的解决方案。)

将您尝试调试的属性声明为
private
,并创建一个
\u集
方法。在这里面,你将能够找到你的答案

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;
    }
}

编辑:这是getter和setter的另一个显著原因:)

根据xdebug文档,似乎应该有一种方法来打破变量更改。

监视:在写入由 表达式参数

但源代码表明,文档比其实际功能先进:

实际上,我无法在回购协议的任何其他地方找到字符串“watch”,因此我的假设是,它目前不受支持

Xdebug的bug跟踪器中似乎有bug:


正如我在问题末尾所说的,如果对象本身已经有了复杂的setter逻辑,那么这是非常困难的。(当然,“非常难”仍然比“不可能”好。)不明白为什么这很难?如果你的对象已经有了一个
\uuu set
方法,为什么你不能检查哪个变量是
\uu set
,如果它是你想要的,就中断它呢?不管里面有什么?也许如果你展示一下你的魔法集的样子,我们可以帮你。旁注:你在问题中提到了神奇的接球手,而不是神奇的二传手。这是一个拼写错误(现在修复了,谢谢)。问题是对象的setter本身可能会将对
$o->foo
的访问转换为对
$o::\u foo
的访问(或者做比这更复杂的事情)。通常情况下,我会遇到框架对象(在本例中是
Zend_Navigation_Page
)的问题,这些对象通常具有非常复杂的初始化逻辑。还应该提到的是,如果属性值没有被替换,而是被修改,即如果属性是数组
$this->arr=[]
,并且您正在修改它,例如
$this->arr[1]=2
,则必须在
\uu get
方法中设置断点。链接的xdebug问题已解决,解决方案为“不会修复”。我已经在中创建了新的错误报告
if (strcmp(CMD_OPTION('t'), "watch") == 0) {
        RETURN_RESULT(XG(status), XG(reason), XDEBUG_ERROR_BREAKPOINT_TYPE_NOT_SUPPORTED);
    }