我试图找出一个特定对象的特定属性,都会修改。 由于PHP的高度动态性( $o->$prop = $val
和这样),这是几乎不可能通过简单的代码分析做。 是否有一个地方开始属性,都会修改在该行调试会话和休息方式吗? (添加魔法__set
与条件xdebug_break()
调用的类简单的情况下可能有帮助,但如果该类或它的一个祖先已经拥有了神奇的制定者,它可以变得很复杂,所以这不是一个好的解决方案。 )
Answer 1:
根据该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);
}
我本来就不是能找到字符串“手表”的回购其他地方,所以我的假设是,它是当前不支持。
似乎有在Xdebug的的bug跟踪系统的bug:
http://bugs.xdebug.org/view.php?id=514
Answer 2:
声明:您要调试的财产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;
}
}
编辑:这是一个getter和setter的另一个惊人的原因:)
文章来源: Break on property change in Xdebug