PHP Xdebug 覆盖 __Dir__ 和 __File__ 常量

PHP Xdebug Overrides __Dir__ and __File__ constant

在 VS 代码中使用“侦听 XDebug”调试 PHP 脚本时(PHP 通过 Felix Becker 扩展进行调试),我发现 __DIR__ and __File__ 应该return 当前 运行 脚本的目录和文件名正在被 Xdebug 覆盖:

__DIR__ contains
"xdebug:"
__FILE__ contains
"xdebug://debug-eval"

但是,如果我将值分配给局部变量,它会按预期工作。

$dir = __DIR__; // $dir holds the correct path, instead of "xdebug:"

这里遇到了这个问题 Xdebug weird __DIR__ constant

但是 post 是旧的,并且缺少对意外行为的足智多谋的解释。

感谢您的帮助。

您得到的输出没有错误。 __FILE__ 是一个特殊常量,在解析器时进行计算。当 PHP 脚本被编译时,它实际上会读取这样的内容:

// test.php
<?php
    "test.php";
?>

即使脚本源是:

// test.php
<?php
    __FILE__;
?>

这意味着在解析之后,根本就没有这样的“常量”__FILE__,因为它已经被替换了。

这意味着如果您在 IDE 中执行操作,通过 DBGp 的 eval 命令 eval -- __FILE__ 它可以 而不是 给您 __FILE__ 与任何文件名。相反,它使用当前上下文的文件名 xdebug eval 或更高版本 xdebug://debug-eval.

本质上和这样做是一样的:

php -r 'eval("__FILE__;");'

这也输出:

Command line code(1) : eval()'d code

Xdebug 寻找这种格式,并将其更改为 xdebug://debug-eval 以便它可以实际调试到已评估的代码中。

__FILE__ 在 PHP 源代码中按预期工作,这一点可以证明:

<?php $far = __FILE__; // now evaluate $far in your IDE ?>