22 December 2009

Читаем мануалы — об одном секрете include

Lumber room
Для тех, кто приходит в мир PHP с С или других языков зачастую бывают откровением некоторые особенности языка, которые описаны в документации, но, тем не менее, часто ускользают из виду.

Сегодня я хочу рассказать о нестандартном (с точки зрения большинства программистов) использовании оператора 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 я использую на собеседовании с программистами. Решающего значения они не имеют, конечно, но позволяют понять, насколько глубоко человек знает используемый язык.
Tags:php
Hubs: Lumber room
+13
278 15
Comments 33