Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

«Функция» 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 2014

Тут используется (почему-то) малоизвестная особенность ПХП — из подключаемого файла можно
вернуться при помощи 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 почти никто не знает.

Горбунов Олег 2014

Почему малоизвестная? Очень многие фреймворки так возвращают настройки из конфига, плюсы очевидны:

  1. Не отобразится в браузере, даже если вдруг кто-то запросит файл напрямую.
  2. Не занимает глобальную область видимости ненужными переменными.
Евгений Степанищев (bolknote.ru) 2014

Комментарий для Горбунов Олег:

Выборочно написал десятку программистов — не знает ни один. Потому и подумал, что малоизвестная.

hshhhhh (hshhhhh.name) 2014

Комментарий для Евгения Степанищева:

Я пользуюсь когда лень делать что-нибудь серъезное :)

gogis 2014

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

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 уже много лет.

gogis 2014

Забыл уточнить, это float ключ для массива, конечно же

Евгений Степанищев (bolknote.ru) 2014

Комментарий для gogis:

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

ilih 2014

использую в шаблонах в guard condition
if (count($list)==0)
{
   return ;
}