2012-04-13 14 views
8

Powiel możliwe:
Execute a PHP file, and return the result as a string
PHP capture print/require output in variableJak uzyskać zawartość jako ciąg?

Próbuję uzyskać zawartość include na sznurku. Czy to jest możliwe?

Na przykład, jeśli mam plik test.php:

<?php 
echo 'a is equal to '.$a; 
?> 

muszę funkcję, powiedzmy include_to_string włączenie test.php i powrotu co byłoby wyjście przez ww sznurku.

Coś jak:

<?php 
$a = 4; 
$string = include_to_string(test.php); // $string = "a is equal to 4" 
?> 
+0

@safarov domyślam się, że to nie będzie ocenić jego zmienna –

+0

myślę, że nie będzie zastępować $ a w pliku test.php. niech sprawdzę. – ppp

Odpowiedz

28
<?php 

    ob_start(); 
    include 'test.php'; 
    $string = ob_get_clean(); 

myślę to, co chcesz. Zobacz output buffering.

+1

Ta technika jest nazywana buforowaniem wyjściowym dla każdego ciekawskiego. –

+0

@ Xeon06 Właśnie dodałem ręczny link podczas pisania komentarza! Pozdrawiam za prod :-) – DaveRandom

+0

@nickb [Nie, to nie] (http://php.net/manual/en/function.ob-get-clean.php), 'ob_end_clean()' zwraca 'bool '. 'ob_get_clean()' jest skrótem do wywoływania '$ str = ob_get_contents(); ob_end_clean(); ' – DaveRandom

5
ob_start(); 
include($file); 
$contents = ob_get_contents(); // data is now in here 
ob_end_clean(); 
3

Można to zrobić z output buffering:

function include2string($file) { 
    ob_start(); 
    include($file); 
    return ob_get_clean(); 
} 

@DaveRandom zaznacza (słusznie), że problem z tym owijania w funkcji jest to, że skrypt ($ file) nie będą miały dostępu do zmienna zdefiniowana globalnie. Może to nie być problemem dla wielu skryptów dołączanych dynamicznie, ale jeśli jest to problem dla ciebie, technika ta może być używana (jak pokazali inni) poza otoką funkcji.

** Importowanie zmiennych Jedną z rzeczy, którą możesz zrobić, to dodać zestaw danych, które chciałbyś narazić na swój skrypt jako zmienne. Pomyśl o tym, jak przekazywanie danych do szablonu.

function include2string($file, array $vars = array()) { 
    extract($vars); 
    ob_start(); 
    include($file); 
    return ob_get_clean(); 
} 

nazwałbyś to w ten sposób:

include2string('foo.php', array('key' => 'value', 'varibleName' => $variableName)); 

i teraz $key i $variableName byłby widoczny wewnątrz pliku foo.php.

Można również podać listę zmiennych globalnych, które można zaimportować do skryptu, jeśli wydaje się to bardziej zrozumiałe.

function include2string($file, array $import = array()) { 
    extract(array_intersect_key($GLOBALS, array_fill_keys($import, 1))); 
    ob_start(); 
    include($file); 
    return ob_get_clean(); 
} 

I chcesz to nazwać, dostarczając listę globalnych które chcesz narażonych na działanie skryptu:

$foo='bar'; 
$boo='far'; 
include2string('foo.php', array('foo')); 

foo.php powinien być w stanie zobaczyć foo, ale nie boo.

+0

Problem z zawijaniem go w funkcję to zakres zmienny ... – DaveRandom

+0

@DaveRandom, good call. – Prestaul

+0

to właśnie robiłem źle. Natrafiłem na tę metodę w innej odpowiedzi, ale dostałem niezadeklarowany błąd zmiennej, ponieważ zmienne zostały zadeklarowane poza zakresem funkcji. – ppp

0

Można również użyć tego poniżej, ale polecam powyższą odpowiedź.

// How 1th 
$File = 'filepath'; 
$Content = file_get_contents($File); 

echo $Content; 

// How 2th 
function FileGetContents($File){ 
    if(!file_exists($File)){ 
     return null; 
    } 

    $Content = file_get_contents($File); 
    return $Content; 
} 

$FileContent = FileGetContents('filepath'); 
echo $FileContent; 

Funkcja w podręczniku PHP: file_get_contents

+0

To dostaje zawartość, ale nie wykona PHP w załącznikach i zwróci surowy kod PHP. – MrCode

+0

To prawda, nie widziałem słowa kluczowego egzekucji w poście OP ... Być może źle zrozumiałem to pytanie. –

+0

@MrCode Przypuszczam, że mógłbyś "eval()" (zła) to, ale nadal cierpi na problem ze zmiennym scopingiem, który dostajesz z robienia tego w funkcji i jest prawdopodobnie droższy niż tylko 'include()' in the pierwsze miejsce – DaveRandom

Powiązane problemy