【发布时间】:2026-01-29 22:50:01
【问题描述】:
最近,当我使用 XDebug(在 Ubuntu 上的 Eclipse 下)调试一些 PHP 文件时,我遇到了一个奇怪的行为:
print(__FILE__);
导致
"xdebug eval"
哎呀!
所以这个魔法常数似乎不适用于此。
有人知道修复方法或可行的解决方法吗?如何调试调试器? (硬编码路径是 PITA!)
【问题讨论】:
最近,当我使用 XDebug(在 Ubuntu 上的 Eclipse 下)调试一些 PHP 文件时,我遇到了一个奇怪的行为:
print(__FILE__);
导致
"xdebug eval"
哎呀!
所以这个魔法常数似乎不适用于此。
有人知道修复方法或可行的解决方法吗?如何调试调试器? (硬编码路径是 PITA!)
【问题讨论】:
您得到的输出不正确。 __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 源代码中按预期工作,这可以用这个 sn-p 证明:
<?php $far = __FILE__; // now evaluate $far in your IDE ?>
【讨论】:
尽管这是一个相当古老的话题,但它仍然是真实的。这就是为什么我要在这里复制粘贴类似主题的答案。
这是 XDEBUG 问题,可以通过将 XDEBUG 版本降级(或升级,以防您使用非常旧的 PHP)到 2.6.1 来解决。 我不小心遇到了这个问题,无法找到答案。重新安装服务器、PHP、PHPStorm、不同版本的 XDEBUG 没有帮助。 对于 MacOS 可以使用
pecl install xdebug-2.6.1
如果你已经有更新的版本,你可以使用命令
pecl uninstall xdebug
经过几个小时的调查,this article 中的答案对我帮助很大。
【讨论】:
不是答案,但您可能可以在 php 5.3 中使用 __DIR__。
UPD。发现它通常包含的不是您所期望的。
【讨论】:
我知道这是一个老问题。我通过将它分配给一个变量来解决,然后它工作正常!
$file = __FILE__;
include dirname($file) . '/../whateverfile.php';
【讨论】:
在print(__FILE__); 行上创建一个断点并分析哪些变量可供您使用。
【讨论】: