2010-01-27 4 views

ответ

28

Вы хотите посмотреть на функции буферизации вывода.

//get anything that's in the output buffer, and empty the buffer 
$oldContent = ob_get_clean(); 

//start buffering again 
ob_start(); 

//include file, capturing output into the output buffer 
include "test.php"; 

//get current output buffer (output from test.php) 
$myContent = ob_get_clean(); 

//start output buffering again. 
ob_start(); 

//put the old contents of the output buffer back 
echo $oldContent; 

РЕДАКТИРОВАТЬ:

Как Джереми указывает, выходные буферы стека. Поэтому теоретически вы можете просто сделать что-то вроде:

<?PHP 
function return_output($file){ 
    ob_start(); 
    include $file; 
    return ob_get_clean(); 
} 
$content = return_output('some/file.php'); 

Это должно быть эквивалентно моему более подробному оригинальному решению.

Но я не потрудился проверить это.

+2

Почему необходимо останавливать существующие буферы? Выходные буферы в стеке PHP: http://php.net/ob_start –

+2

Это не так: я просто не заметил стекируемость. Редактирование моего ответа. – timdev

8

Пробег: file_get_contents().

Эта функция аналогична file(), за исключением того, что file_get_contents() возвращает файл в виде строки.

+0

Определенно лучший ответ здесь. Короткий. Умная. –

9

Try что-то вроде:

ob_start(); 
include('test.php'); 
$content = ob_get_clean(); 
-1

Вы можете использовать функцию file_get_contents.

+1

Интересно, почему вы предлагаете выходную буферизацию, когда это намного проще. –

+17

Возможно, потому что file_get_contents не выполняет PHP-код в файле? – fool4jesus

4

Решение # 1: использование Make заголовочных (работает как функция): [Мой лучшее решение] index.php

Файл: included.php

<?php 
$bar = 'BAR'; 
$php_file = include 'included.php'; 
print $php_file; 
?> 

Файл:

<?php 
$foo = 'FOO'; 
return $foo.' '.$bar; 
?> 
<p>test HTML</p> 

Это будет выводить FOO BAR, но Примечание: Работа s как функции, так RETURN пропускает содержимое обратно в переменную (<p>test HTML</p> будет потеряна выше)


Решение # 2: op_buffer():

index.php

Файл:

<?php 
$bar = 'BAR'; 
ob_start(); 
include 'included.php'; 

$test_file = ob_get_clean(); //note on ob_get_contents below 
print $test_file; 
?> 

Включенный файл.PHP:

<?php 
$foo = 'FOO'; 
print $foo.' '.$bar; 
?> 
<p>test HTML</p> 

Если вы используете ob_get_contents() он будет выводить FOO BAR<p>test HTML</p>ДВАЖДЫ, убедитесь, что вы используете ob_get_clean()


Решение # 3: file_get_contents():

индексных файлов. php:

<?php 
$bar = 'BAR'; 
$test_file = eval(file_get_contents('included.php')); 

print $test_file; 
?> 
included.php

Файл:

$foo = 'FOO'; 
print $foo.' '.$bar; 

Это будет выводить FOO BAR, но Примечание: Include.php не должны иметь <?php открытие и закрытие тегов, как вы работаете через Eval()

+0

Единственная причина, по которой буфер будет выводить дважды, - это если буфер не был удержан, а затем очищен до конца файла, что означает, что буфер автоматически будет эхом. Возможно, это проблема, с которой вы столкнулись. – worldofjr

+1

Aah, спасибо @worldofjr, вы не были действительно конкретны, но указали мне в правильном направлении на OB; 'ob_get_contents()' должен быть 'ob_get_clean()' иначе он выдает два раза. Ответ редактируется соответствующим образом. – Duncanmoo

0

другие ответы по неизвестным мне причинам не вполне соответствуют правильному решению.

Я предлагаю использовать буфер, но вы должны получить содержимое, а затем очистить буфер до конца страницы, иначе он будет выведен. Если вы хотите использовать вывод из включенного файла, вы должны использовать op_get_contents(), который вернет строку содержимого буфера.

Вам также не нужно зацикливать на включения, поскольку каждый будет просто добавлять в буфер (если вы не очистите его в первую очередь).

Таким образом, вы можете использовать следующее:

ob_start(); 
include_once('test.php'); 
include_once('test2.php'); 
$contents = ob_get_contents(); 
ob_end_clean(); 

Надеюсь, это поможет.

Смежные вопросы