«Функция» 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';
}
5 марта 2014 22:16

PastorGL (инкогнито)
5 марта 2014, 23:35

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

Горбунов Олег (инкогнито)
6 марта 2014, 06:05

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

Евгений Степанищев (bolknote.ru)
6 марта 2014, 06:16, ответ предназначен Горбунову Олегу

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

hshhhhh (hshhhhh.name)
6 марта 2014, 13:38, ответ предназначен Евгений Степанищев (bolknote.ru):

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

gogis (инкогнито)
6 марта 2014, 19:40

Я сегодня впервые наткнулся на
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 (инкогнито)
6 марта 2014, 19:41

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

Евгений Степанищев (bolknote.ru)
6 марта 2014, 20:42, ответ предназначен gogis

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

ilih (инкогнито)
6 марта 2014, 21:56

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)