Contributing Advent 8: The magic __FILE__ constant

This issue came up in the #xdebug IRC channel on Freenode:

18:25 <user> no magic constants for PHP ?
18:27 <user> __FILE__ evaluates to "xdebug://debug-eval"

The user noticed this issue in the Eclipse expression evaluator. A similar issue is also described a few times on the internet:

With the hint in comment 2 in the first URL, I answered the report in an answer on StackOverflow (the third URL). I am repeating this answer (with some modifications) here:

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

// test.php

even though the script source was:

// test.php

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

This means that if you evaluate __FILE__ in an IDE, through DBGp's eval command with eval -- __FILE__ it can not return you a filename that is represented through the __FILE__ "constant". 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 output format, and changes it to xdebug://debug-eval so that it can actually debug into eval'ed code.

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

$currentFilename = __FILE__;

And after it has been assigned to a variable, you can evaluate $currentFilename in your IDE.


No comments yet

Add Comment


Will not be posted. Please leave empty instead of filling in garbage though!

Please follow the reStructured Text format. Do not use the comment form to report issues in software, use the relevant issue tracker. I will not answer them here.

All comments are moderated

Life Line