我正在Visual Studio Code中使用插件PHP Debugger调试PHP代码。 PHP <= 5.6时一切正常。调试器的工作就像一个魅力。 但是,当我尝试使用PHP 7调试代码时,它无法按预期工作。 它没有跳到我添加的断点,我被困在thounsand,除了
发生异常。不推荐使用:与以下名称同名的方法 他们的类将不是PHP未来版本中的构造函数; RecurringType的构造函数已弃用
或
发生异常。警告:AntlrLexer :: matchAny()的声明 应该与BaseRecognizer :: matchAny($ input)
兼容
或
发生异常。注意:试图获取非对象的属性
这些异常是由框架生成的,因此我无法全部解决,我只想跳过所有这些异常,仅跳到我的断点。
我该如何实现? 谢谢。
答案 0 :(得分:3)
我不知道这是否适合您的配置(我正在将PHP 7.2与WordPress配合使用),并且发现这可以防止XDebug触发所有异常,警告,通知等,如果我只是想遍历我自己的代码部分。
首先,在Everything
调试部分中取消选中所有内容(包括Breakpoints
,如果已选中):
然后将鼠标悬停在Breakpoints
栏上,然后单击+
:
现在添加要调试的函数的名称:
最后,在该函数中设置一个断点。现在,您将只能在该函数内触发XDebug逐步调试:
大概可以根据需要添加任意数量的函数断点。有趣的是,如果您有多个具有相同名称的功能,则只需添加一次功能名称。
答案 1 :(得分:0)
听起来您正在使用的框架是在考虑PHP 7之前的版本的情况下编写的。错误处理具有changed,现在,更准确地说,是未处理的异常或Throwable
实例,将冒充到set_exception_handler()函数定义的异常处理函数。更大的问题是致命错误意味着砰砰,进程已死,调试器无法绑定任何内容。
PHP 7更改了PHP报告大多数错误的方式。现在,大多数错误不是通过PHP 5使用的传统错误报告机制来报告错误,而是通过抛出Error exceptions来报告。
与普通异常一样,这些Error异常会冒泡直到到达第一个匹配的catch块。如果没有匹配的块,则将调用安装有set_exception_handler()的任何默认异常处理程序,如果没有默认的异常处理程序,则该异常将转换为致命错误并将像传统错误一样处理。< / p>
由于Error层次结构不是从Exception继承的,因此使用catch(Exception $ e){...}块来处理PHP 5中未捕获的异常的代码将发现这些Error没有被这些块捕获。
需要catch(Error $ e){...}块或set_exception_handler()处理程序。
那么如何跳过所有这些错误(这些错误将转换为致命错误并停止执行),并使其达到断点?通过使用set_exception_handler()
定义错误处理程序。
在框架自举代码中插入类似的内容。确保在框架可能会覆盖此位置的任何地方查找。
function ignore_exceptions_handler($exception) {
// Do nothing here
}
set_exception_handler('ignore_exceptions_handler');
参考:http://php.net/manual/en/function.set-exception-handler.php
那为什么会发生呢?它与Visual Studio或调试器无关。 PHP 7比以前的版本(即<= 5.6)更明确地执行错误。您使用的框架的PHP 7不支持代码,并且未处理错误。
答案 2 :(得分:0)
就我而言,扩展程序或编辑器默认情况下都选中了EVERYTHING选项。取消选中“所有”复选框可解决此问题。