2010-01-27 16 views

Odpowiedz

28

Będziemy chcieli przyjrzeć się funkcji buforowania wyjścia.

//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; 

EDIT:

Jak Jeremy zwraca uwagę, bufory wyjściowe stosu. Możesz teoretycznie po prostu zrobić coś takiego:

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

To powinno być równoważne z moim bardziej szczegółowym oryginalnym rozwiązaniem.

Ale nie zawracałem sobie głowy przetestowaniem tego.

+2

Dlaczego konieczne jest zatrzymanie istniejących buforów? Bufory wyjściowe w stosie PHP: http://php.net/ob_start –

+2

Nie jest - po prostu nie zauważyłem możliwości układania w stosy. Edytuję moją odpowiedź. – timdev

8

Wypróbuj file_get_contents().

Funkcja ta jest podobna do file(), chyba że file_get_contents() zwraca plik w ciąg.

+0

Zdecydowanie najlepsza odpowiedź tutaj. Krótki. Mądry. –

9

spróbować czegoś jak:

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

Można użyć funkcji file_get_contents.

+1

Zastanawiam się, dlaczego ludzie sugerują buforowanie wyjściowe, gdy jest to o wiele prostsze. –

+17

Być może dlatego, że file_get_contents nie wykonuje kodu PHP w pliku? – fool4jesus

4

Rozwiązanie nr 1: użycie Marka include (działa podobnie jak funkcja): [Mój najlepszym rozwiązaniem] index.php

Plik: included.php

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

Plik:

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

Spowoduje to wyświetlenie FOO BAR, ale Uwaga: Praca s jak funkcja, a więc RETURN karty miejskiej zawartość z powrotem do zmiennej (<p>test HTML</p> zostaną utracone w wyżej)


Rozwiązanie nr 2: op_buffer():

index.php

Plik:

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

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

Plik dołączony.php:

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

Jeśli używasz ob_get_contents() będzie wyjście FOO BAR<p>test HTML</p>DWUKROTNIE, upewnij się, że używasz ob_get_clean()


Rozwiązanie 3: file_get_contents():

indeksu pliku. php:

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

print $test_file; 
?> 
included.php

Plik:

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

Wyjście wola FOO BAR, ale Uwaga: Include.php nie powinien mieć <?php otwierających i zamykających znaczników jak używasz go przez eval()

+0

Jedynym powodem, dla którego bufor wyprowadziłby dwa razy, jest bufor, który nie został zatrzymany, a następnie wyczyszczony przed końcem pliku, co oznacza, że ​​bufor jest automatycznie odtwarzany echem. Być może to jest problem, który masz. – worldofjr

+1

Aah, dzięki @worldofjr, nie byłeś naprawdę konkretny, ale wskazałeś mi właściwy kierunek na OB; 'ob_get_contents()' powinno być 'ob_get_clean()' w przeciwnym razie wyprowadza dwa razy. Odpowiedź jest odpowiednio edytowana. – Duncanmoo

0

The inne odpowiedzi, z nieznanych mi powodów, nie do końca docierają do właściwego rozwiązania.

Proponuję użyć bufora, ale musisz pobrać zawartość, a następnie wyczyścić bufor przed końcem strony, w przeciwnym razie zostanie wyprowadzony. Jeśli chcesz użyć danych wyjściowych z dołączonego pliku, powinieneś użyć op_get_contents(), która zwróci ciąg zawartości bufora.

Nie musisz też zamykać pętli, ponieważ każdy z nich będzie po prostu dodawany do bufora (chyba że najpierw go wyczyścisz).

Można zatem użyć następujących;

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

Mam nadzieję, że to pomoże.

Powiązane problemy