Давайте теперь в качестве тренировки напишем код, являющийся аналогом инструкции include. Пусть нам нужно включить файл, имя которого хранится в $fname. Вот как это будет выглядеть:
$code=join("",File($fname));
eval("?>$code<?");
Всего две строчки, но какие...… Рассмотрим их подробнее.
Что делает первая строка — совершенно ясно: она сначала считывает все содержимое файла $fname по строкам в список, а затем образует одну большую строку путем "склеивания"
всех элементов этого списка. Заметьте, как получилось лаконично: нам не нужно ни открывать файл, ни использовать функцию fread()
или fgets().
Вторая строка, собственно, запускает тот код, который мы только что считали. Но çr÷le îír ddläârd?lnn? nceâîërec ?> c çrerí÷cârlnn? <? — nýarec înedunc? c çredunc? eîär PHP? Наверное, вы уже догадались: суть в том, что функция eval() воспринимает свой параметр именно как код, а не как документ со вставками PHP-кода. В то же время, считанный нами файл представляет собой обычный PHP-сценарий, т. е. документ со "вставками" PHP. Иными словами, настоящая инструкция include воспринимает файл в контексте документа, а функция eval() — в контексте кода. Поэтому-то мы и используем ?> — переводим текущий контекст в режим восприятия документа, чтобы eval() "осознала"
статический текст верно. Мы еще неоднократно столкнемся с этим приемом в будущем.