2009-04-17 18 views
16

Jeśli mam plik hello.php takiego:Czy możesz renderować plik PHP do zmiennej?

Hello, <?php echo $foo; ?>! 

chciałbym zrobić coś takiego w niektórych kodu PHP:

$text = renderPhpToString('hello.php', array('foo'=>'World')); 

i skończyć z

$text == 'Hello, World!' 

Czy to możliwe przy standardowym PHP 5? Oczywiście chcę bardziej skomplikowanych szablonów z pętli i tak dalej ..

Odpowiedz

36

Można korzystać z niektórych funkcji tak:

function renderPhpToString($file, $vars=null) 
{ 
    if (is_array($vars) && !empty($vars)) { 
     extract($vars); 
    } 
    ob_start(); 
    include $file; 
    return ob_get_clean(); 
} 

Wykorzystuje funkcję sterowania bufor wyjściowy ob_start() do bufora, dopóki nie jest zwracany przez ob_get_clean() następujący wynik.

Edit Sprawdź, czy sprawdzania poprawności danych przekazywanych do tej funkcji, tak aby $vars nie ma file element, który by przesłonić przekazywana wartość argumentu $file.

+3

lepiej nadzieję, że ktoś nie wysyła $ vars = array ('file' => 'http://example.com/hax.php') –

+0

Właśnie tego szukam. W moim przypadku nie musisz się martwić wprowadzaniem danych przez użytkownika. Dzięki! – danb

+1

>> Nie ma potrzeby martwić się wprowadzaniem danych przez użytkownika w moim przypadku. Nie martwisz się tylko wprowadzaniem danych przez użytkownika; przyszły programista może wywołać funkcję za pomocą $ vars = array ('file' => 'http://example.com/whoops.php'), a następnie poświęcić sporo czasu, aby to zliczyć. –

2

Jako że Gumbo powiedział, że musisz sprawdzić zmienną $ file, jest to subtelny błąd, który już mnie ugryzł. Chciałbym użyć func_get_arg (i) i nie mam żadnych zmiennych, a drobiazg, użyłbym wymagać.

function renderPhpToString() 
{ 
    if(is_array(func_get_arg(1))) { 
     extract(func_get_arg(1)); 
    } 
    ob_start(); 
    require func_get_arg(0); 
    return ob_get_clean(); 

} 
+0

Dlaczego po prostu nie zrobić '$ vars = []'? –

2

dotyczące przechodzenia $vars = array('file' => '/etc/passwd');, można użyć extract($vars, EXTR_SKIP);

+0

IMHO, jeśli uważasz, że możesz potrzebować 'EXTR_SKIP', powinieneś rozważyć, czy nie ma lepszego rozwiązania. –

Powiązane problemy