Как я могу заставить магическую константу PHP __FILE__ работать с Eclipse и PDT - PullRequest
10 голосов
/ 07 февраля 2011

В последнее время, когда я отлаживал какой-то PHP-файл с помощью XDebug (в Eclipse в Ubuntu), я обнаружил странное поведение:

print(__FILE__);

привело к

"xdebug eval"

GEE!

Так что эта магическая константа, похоже, не работает с этим.

Кто-нибудь знает исправление или жизнеспособный обходной путь? Как отладить отладчик? (Жесткое кодирование пути - это PITA!)

Ответы [ 4 ]

7 голосов
/ 28 ноября 2013

Вывод, который вы получаете, не является неправильным. __FILE__ - это специальная константа, которая вычисляется во время синтаксического анализа. Когда PHP-скрипт компилируется, он действительно читает что-то вроде этого:

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

несмотря на то, что источником скрипта было:

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

Это означает, что после синтаксического анализа такой "постоянной" __FILE__ вообще не существует, поскольку она уже была заменена.

Это означает, что если вы делаете это в IDE, то через eval команду DBGp eval -- __FILE__ он может , а не дать вам __FILE__ с любым именем файла. Вместо этого он использует имя файла для текущего контекста, которое xdebug eval или в более поздних версиях xdebug://debug-eval.

По сути, это то же самое, что делать это:

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

Который также выводит:

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

Xdebug ищет такой формат и изменяет его на xdebug://debug-eval, чтобы он мог фактически отлаживаться в eval'ed-код.

__FILE__ работает как и ожидалось в исходном коде PHP, что можно проверить с помощью следующего фрагмента:

<?php $far = __FILE__; // now evaluate $far in your IDE ?>
0 голосов
/ 01 сентября 2017

Я знаю, что это старый вопрос. Я решил присвоить его переменной, тогда он отлично работает!

$file = __FILE__;
include dirname($file) . '/../whateverfile.php';
0 голосов
/ 05 апреля 2013

Не ответ, но вы, вероятно, могли бы использовать __DIR__ в php 5.3.
UPD. Обнаружено, что оно часто содержит не то, что вы ожидаете.

0 голосов
/ 07 февраля 2011

Создайте точку останова в строке print(__FILE__); и проанализируйте, какие переменные вам доступны.

...