How can i get the PHP magic constant __FILE__ work

2019-02-12 14:49发布

问题:

Lately when i was debugging some PHP file with XDebug (under Eclipse on Ubuntu) i came across a strange behaviour:

print(__FILE__);

resulted in

"xdebug eval"

GEE!

So this magic constant seems not to work with this.

Anyone know a fix or a viable workaround? How to debug the debugger? (Hardcoding a path is a PITA!)

回答1:

The output you get is not incorrect. __FILE__ is a special constant that gets evaluated at parser time. When the PHP script gets compiled, it would really read something like this:

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

even though the script source was:

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

This means that after parsing, there is no such "constant" __FILE__ at all, as it has already been replaced.

This means that if you do in an IDE, through DBGp's eval command eval -- __FILE__ it can not give you the __FILE__ with any filename. Instead, it uses the filename for the current context which is xdebug eval or in later versions, xdebug://debug-eval.

In essence, it's the same as doing this:

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

Which also outputs:

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

Xdebug looks for this sort of format, and changes it to xdebug://debug-eval so that it can actually debug into eval'ed code.

__FILE__ works as expected in PHP source code, as can be proven with this snippet:

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


回答2:

Not an answer, but you probably could use __DIR__ in php 5.3.
UPD. Found that it often contains not what you expect it to.



回答3:

I know it is an old question. I solved by assigning it to a variable, then it works fine!

$file = __FILE__;
include dirname($file) . '/../whateverfile.php';


回答4:

Create a breakpoint on line print(__FILE__); and analyse which variables are available to you.