«Функция» 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';
}
Очень удобная штука, я её активно использовал в своих поделиях для подключения плагинов в песочнице. Вот как-то так:
//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 почти никто не знает.
Почему малоизвестная? Очень многие фреймворки так возвращают настройки из конфига, плюсы очевидны:
Комментарий для Горбунов Олег:
Выборочно написал десятку программистов — не знает ни один. Потому и подумал, что малоизвестная.
Комментарий для Евгения Степанищева:
Я пользуюсь когда лень делать что-нибудь серъезное :)
Я сегодня впервые наткнулся на
а пишу на PHP уже много лет.
Забыл уточнить, это float ключ для массива, конечно же
Комментарий для gogis:
С массивами в ПХП вообще печаль. А всё из-за того, что массивы и хеши пытаются притворяться одним типом.
использую в шаблонах в guard condition
if (count($list)==0)
{
return ;
}