Что ж, в документации говорится:
Поскольку 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'];
Во всех этих случаях используется поведение по умолчанию анализатора.Разработчики решили одну возможность, потому что они должны были.Возможно, это не то, что вы ожидаете, но если вы это знаете, вы можете с этим справиться.
Это поведение нельзя просто изменить, так как оно может нарушить код, основанный на этом поведении.