2010-01-27 10 views

risposta

28

Ti consigliamo di guardare la funzione di buffer.

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

Come Jeremy sottolinea, pila buffer di uscita. Quindi potresti teoricamente fare qualcosa del tipo:

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

Questo dovrebbe essere equivalente alla mia soluzione più verbosa originale.

Ma non mi sono preso la briga di testare questo.

+2

Perché è necessario interrompere eventuali buffer esistenti? Buffer di output nello stack PHP: http://php.net/ob_start –

+2

Non lo è - non avevo notato l'impilabilità. Modifica la mia risposta. – timdev

8

Prova file_get_contents().

Questa funzione è simile a file(), tranne che file_get_contents() restituisce il file in una stringa.

+0

Sicuramente la migliore risposta qui. Corto. Inteligente. –

9

provare qualcosa di simile:

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

È possibile utilizzare la funzione file_get_contents.

+1

Mi chiedo perché la gente suggerisca il buffering dell'output quando questo è molto più semplice. –

+17

Forse perché file_get_contents non esegue il codice PHP nel file? – fool4jesus

4

Soluzione # 1: Fare uso di include (funziona come una funzione): [Il mio migliore soluzione] index.php

File: included.php

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

File:

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

Questo emetterà FOO BAR, ma Nota: Lavoro s come una funzione, in modo RETURN pass contenuti torna alla variabile (<p>test HTML</p> saranno persi nel sopra)


Soluzione # 2: op_buffer():

index.php

File:

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

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

File incluso.php:

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

Se si utilizza ob_get_contents() sarà uscita FOO BAR<p>test HTML</p>DUE VOLTE, assicurarsi di utilizzare ob_get_clean()


Soluzione # 3: file_get_contents():

registro nella cartella. php:

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

print $test_file; 
?> 
included.php

File:

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

Questa uscita volontà FOO BAR, ma Nota: Include.php non dovrebbe avere <?php di apertura e chiusura tag come si esegue attraverso eval()

+0

L'unico motivo per cui il buffer viene emesso due volte è se il buffer non è stato trattenuto e quindi pulito prima della fine del file, il che significa che il buffer viene automaticamente echeggiato. Forse è questo il problema che hai avuto. – worldofjr

+1

Aah, grazie @worldofjr, non eri molto specifico ma mi hai indicato nella giusta direzione su OB; 'ob_get_contents()' dovrebbe essere 'ob_get_clean()' altrimenti viene emesso due volte. Rispondi essere modificato di conseguenza. – Duncanmoo

0

Il altre risposte, per ragioni a me sconosciute, non raggiungono abbastanza la soluzione corretta.

Suggerisco di utilizzare il buffer, ma è necessario ottenere il contenuto e quindi pulire il buffer prima della fine della pagina, altrimenti viene emesso. Se si desidera utilizzare l'output dal file incluso, è necessario utilizzare op_get_contents(), che restituirà una stringa del contenuto del buffer.

Inoltre, non è necessario eseguire il looping degli include, poiché ciascuno aggiungerà al buffer (a meno che non lo si pulisca prima).

È quindi possibile utilizzare quanto segue;

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

Spero che questo aiuti.