我正试图找出某个对象的某个属性被修改的位置。由于PHP的高度动态性($o->$prop = $val
等),通过简单的代码分析几乎不可能做到这一点。有没有办法启动调试会话并在属性被修改的行中断? (在类中添加一个带有条件__set
调用的魔法xdebug_break()
可能有助于简单的情况,但如果该类或其中一个祖先已经有一个魔法设置器,它可能变得非常复杂,所以也不是一个好的解决方案。)
答案 0 :(得分:9)
根据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的bug追踪器中似乎存在错误:
答案 1 :(得分:5)
将您尝试调试的属性声明为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;
}
}
编辑:这是吸气者和制定者的另一个非凡原因:)