PHP: ошибка include () или ошибка пользователя? (Передано имя файла в операторе IF) - PullRequest
0 голосов
/ 20 февраля 2011

Хорошо, поэтому я уже создал ошибку PHP по этому поводу, но она была помечена как поддельная, но я не могу не поверить, что они не читали ее внимательно ...

Ссылка на ошибку # 54042

Ошибка вызвана использованием оператора include() в операторе IF, в результате чего оператор считает, что ему передана пустая строка.

Обзор ошибки объяснит все, включая тестовый скрипт.

Это ошибка, или я что-то упускаю из-за «фича»? Странно видеть, как присвоение выходных данных include переменной и , а затем тестирование этого значения работает нормально (это будет обходной путь).

1 Ответ

4 голосов
/ 20 февраля 2011

Что ж, в документации говорится:

Поскольку include() - это специальная языковая конструкция, скобки вокруг ее аргумента не нужны.Будьте внимательны при сравнении возвращаемого значения.

<?php
// won't work, evaluated as include(('vars.php') == 'OK'), i.e. include('')
if (include('vars.php') == 'OK') {
    echo 'OK';
}

// works
if ((include 'vars.php') == 'OK') {
    echo 'OK';
}
?>

Так что это поведение уже известно и не рассматривается как ошибка.У вас даже есть объяснение , почему работает следующим образом:

include не нуждается в скобках, поэтому PHP на самом деле не хочет, хотите ли вы:

include('vars.php') 

или

include(('vars.php') == 'OK')

Похоже, что он реализован для прерывания его как последнего (что-то вроде максимально длинного совпадения).

То же самое относится к

$v = include('foo') . 'bar';

который PHP интерпретирует как

$v = include(('foo') . 'bar');

и пытается загрузить foobar.

Но решение также дается: заключите весь оператор включения в круглые скобки, тогда есть только один способ, как PHPможет интерпретировать вызов:

$v = (include ('foo')) . 'bar';

(возможно) не по теме: аналогичные «проблемы» вы найдете в других частях PHP.Возьмем переменные:

$obj->$foo['bar'];

PHP не знает, хотите ли вы получить доступ к элементу bar массива $foo и использовать это значение в качестве имени свойства:

$obj->{$foo['bar']};

или если вы хотите получить доступ к элементу bar из $obj->$foo:

{$obj->$foo}['bar'];

Во всех этих случаях используется поведение по умолчанию анализатора.Разработчики решили одну возможность, потому что они должны были.Возможно, это не то, что вы ожидаете, но если вы это знаете, вы можете с этим справиться.

Это поведение нельзя просто изменить, так как оно может нарушить код, основанный на этом поведении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...