«Функция» include

Один из читателей в комментариях к статье про ошибочное толкование пхпешной конструкции «print» как функции, поделился более интересным случаем — таким же заблуждением относительно include.

Речь идёт об использовании include в выражениях, например:

$x = include("value.php") + 1;

Хотя я ни разу не сталкивался с этой проблемой (зато видел проблемные ситуации с print), пример, готов признать, более жизненный — такое использование имеет смысл и наверняка встречается нередко.

Тут используется (почему-то) малоизвестная особенность ПХП — из подключаемого файла можно вернуться при помощи return с возвратом какого-либо значения, именно его и вернёт include.

Пример же иллюстрирует ровно ту же проблему, что и в случае с print: если программист не знает в чём различие конструкции и функции, он посчитает, что тут к возращаемому значению добавится единица.

На самом деле, скобки не являются часть конструкции include (она в скобках не нуждается), для неё скобки — просто часть единого аргумента «(„value.php“) + 1» и на вход include поступит значение «1», а это вряд ли то, чего программист добивался в этом примере.

В документации к ПХП написано как следует поступать в этом случае:

// неправильно, будет трактоваться как include(('vars.php') == 'OK'), т.е. include('')
if (include('vars.php') == 'OK') {
    echo 'OK';
}

// а вот так — правильно
if ((include 'vars.php') == 'OK') {
     echo 'OK';
}

Комментарии 8

PastorGL № 1
Тут используется (почему-то) малоизвестная особенность ПХП — из подключаемого файла можно
вернуться при помощи return с возвратом какого-либо значения, именно его и вернёт include.

Очень удобная штука, я её активно использовал в своих поделиях для подключения плагинов в песочнице. Вот как-то так:

//host.php
function sandbox($args…) {
//necessary magic to prepare $vars from $args
$result = include «plugins/sandboxed.php»;
//magic to sanitize $result
return $result;
}

// plugins/sandboxed.php
//code
return $result;

Странно, что про return from include почти никто не знает.

Горбунов Олег № 2
Почему малоизвестная? Очень многие фреймворки так возвращают настройки из конфига, плюсы очевидны:
1. Не отобразится в браузере, даже если вдруг кто-то запросит файл напрямую.
2. Не занимает глобальную область видимости ненужными переменными.
gogis № 5

Я сегодня впервые наткнулся на

Floats are also cast to integers, which means that the fractional part will be truncated. E.g. the key 8.7 will actually be stored under 8

а пишу на PHP уже много лет.

Евгений Степанищев (bolknote.ru) автор № 7
Комментарий для gogis:

С массивами в ПХП вообще печаль. А всё из-за того, что массивы и хеши пытаются притворяться одним типом.