Как я могу заставить магическую константу PHP __FILE__ работать с Eclipse и PDT

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

print(__FILE__);

привело к

"xdebug eval"

GEE!

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

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

4 ответа

Вывод, который вы получаете, не является неправильным. __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 так что он может на самом деле отладить в eval'ed код.

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

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

Несмотря на то, что это довольно старая тема, но она все еще актуальна. Вот почему я собираюсь скопировать сюда свой ответ из аналогичной темы.

Это проблема XDEBUG, которая может быть исправлена ​​понижением (или обновлением, если вы работаете с очень старым PHP) версии XDEBUG до 2.6.1. Я случайно столкнулся с этой проблемой и не смог найти ответа. Переустановка сервера, PHP, PHPStorm, разных версий XDEBUG не помогла. Для MacOS можно использовать

pecl install xdebug-2.6.1

Если у вас уже есть более новая версия, вы можете использовать команду

pecl uninstall xdebug

Ответы в этой статье мне очень помогли после нескольких часов исследования.

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

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

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

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

Другие вопросы по тегам