2013-06-24 2 views
0

Мне нужно включить PHP-файл, используя Apache SSI, а не директиву PHP include.Переменная PHP неопределенная во включенном файле

В page.php у меня есть:

<body> 
<?php 
$text = "This is text"; 
?> 
<!--#include virtual="file.php" --> 
</body> 

В file.php у меня есть:

<p>This is a test</p> 
<?php 
echo "<p>".$text."</p>"; 
?> 

Отображается первая строка текста, но затем я получаю ошибку «Undefined переменной в файле .php line 3. "

Я думал, что SSI была встроенной заменой, поэтому не должно быть проблем с определением области обзора? Какую прекрасную печать я пропустил? John

+0

Вы почти правильно поняли, НО: «встроенный» из чего? Механизмы apache, конечно, не могут работать внутри движка php, это разные уровни. Включение происходит внутри обработки запроса в apache, а не в стороне php. Таким образом, первое выполнение сценариев создает текст разметки, содержащий включение SSI, тогда и только тогда это включение может быть обработано apache. Но это означает: первый шаг интерпретации оставлен, поэтому все переменные там потеряны. – arkascha

+0

В документации (http://httpd.apache.org/docs/2.2/howto/ssi.html) указано, что директива 'virtual' принимает оцениваемый вывод вашего файла' file.php', который вы включили. Поэтому сначала обрабатывается ваш php-файл 'file.php' и включается результат. Документация также предупреждает, что это более или менее включает статический контент. Почему вы не можете просто использовать php-include? – blad

+0

Спасибо за разъяснение. Знаешь, там был мелкий шрифт. Я ищу хак, который позволяет мне включать файл из файла PHP или HTML. Настоящий код проверяет, существует ли переменная, прежде чем пытаться ее использовать. – John

ответ

0

Когда page.php выполнен процессором php, он ничего не знает о включении apache - это просто выглядит как комментарий HTML к нему. Поэтому он просто выполняет код PHP, что он видит, а затем выписывает остальное, как HTML, создавая что-то вроде этого:

<body> 
<!--#include virtual="file.php" --> 
</body> 

В следующем шаге апача будет увидеть #include и попытаться выполнить file.php. Но на этом этапе переменная $text уже давно ушла. Поскольку file.php выполняется как отдельный файл, он, очевидно, будет генерировать ошибку при попытке получить доступ к переменной $text.