Как я могу заставить магическую константу 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__);
и проанализируйте, какие переменные вам доступны.