Для тех, кто приходит в мир PHP с С или других языков зачастую бывают откровением некоторые особенности языка, которые описаны в документации, но, тем не менее, часто ускользают из виду.
Сегодня я хочу рассказать о нестандартном (с точки зрения большинства программистов) использовании оператора include в PHP
Оказывается, что этот оператор, помимо своей основной работы — включения в Вашу программу внешнего файла, может еще и вести себя как функция, то есть возвращать значение.
Для того, чтобы получить «значение файла» достаточно во включаемом файле, как в функции, использовать оператор return. Тогда становятся возможными такие конструкции:
a.php:
b.php:
На личном опыте я нашел два вполне практических и практичных варианта применения этого «выверта».
Во многих CMS, ведущих свое родство от Nuke — это и XOOPS и RunCMS и новый форк Ronny CMS используется модульно-блочная структура. Модуль реализует некий функционал, а выводит свой контент в блоки, из которых и формируется страница.
Сделано это обычно следующим образом. Каждый модуль имеет список блоков, а для блока задается включаемый файл и функция, выводящая контент:
Соответственно где-то внутри CMS происходит что-то вроде
Таким образом мы имеем лишний уровень абстракции и, что более страшно, — возможность коллизии имен функций.
Рациональнее использовать возможность оператора include возвращать значение из включаемого файла:
, что позволит упростить код и избавиться от опасности совпадения имен функций.
Подобный подход применим не только в блоках CMS, но и везде, где требуется разделение программы на функциональные модули.
Просто проиллюстрирую кодом:
config.php:
test.php:
Все примеры условные и служат лишь для иллюстрации
P.S. Ранее эта тема уже поднималась, например здесь: habrahabr.ru/blogs/php/39034, но я подумал, что ничего плохого в повторении не будет.
P.P.S. Вопрос про значение, возвращаемое include и про конструкции вида $$a я использую на собеседовании с программистами. Решающего значения они не имеют, конечно, но позволяют понять, насколько глубоко человек знает используемый язык.
Сегодня я хочу рассказать о нестандартном (с точки зрения большинства программистов) использовании оператора include в PHP
Оказывается, что этот оператор, помимо своей основной работы — включения в Вашу программу внешнего файла, может еще и вести себя как функция, то есть возвращать значение.
Для того, чтобы получить «значение файла» достаточно во включаемом файле, как в функции, использовать оператор return. Тогда становятся возможными такие конструкции:
a.php:
$ret = 'aaa';
return $ret;
b.php:
$b = include('a.php');
echo $b; // Displays 'aaa'
Для чего это может быть нужно?
На личном опыте я нашел два вполне практических и практичных варианта применения этого «выверта».
1. Построение блоков.
Во многих CMS, ведущих свое родство от Nuke — это и XOOPS и RunCMS и новый форк Ronny CMS используется модульно-блочная структура. Модуль реализует некий функционал, а выводит свой контент в блоки, из которых и формируется страница.
Сделано это обычно следующим образом. Каждый модуль имеет список блоков, а для блока задается включаемый файл и функция, выводящая контент:
$block[0]['file'] = 'block_file.php';
$block[0]['func'] = 'show_func';
Соответственно где-то внутри CMS происходит что-то вроде
include($module . $block[0]['file']);
echo $block[0]['func']();
Таким образом мы имеем лишний уровень абстракции и, что более страшно, — возможность коллизии имен функций.
Рациональнее использовать возможность оператора include возвращать значение из включаемого файла:
echo include($block[0]['file']);
, что позволит упростить код и избавиться от опасности совпадения имен функций.
Подобный подход применим не только в блоках CMS, но и везде, где требуется разделение программы на функциональные модули.
2. Использование в конфигах
Просто проиллюстрирую кодом:
config.php:
$config['host'] = 'test.com';
$config['user'] = 'test';
$config['pwd'] = 'tESt';
return $config;
test.php:
$params = include('config.php');
Все примеры условные и служат лишь для иллюстрации
P.S. Ранее эта тема уже поднималась, например здесь: habrahabr.ru/blogs/php/39034, но я подумал, что ничего плохого в повторении не будет.
P.P.S. Вопрос про значение, возвращаемое include и про конструкции вида $$a я использую на собеседовании с программистами. Решающего значения они не имеют, конечно, но позволяют понять, насколько глубоко человек знает используемый язык.