Если у меня есть файл hello.php, например:
Hello, <?php echo $foo; ?>!
Я хотел бы сделать что-то вроде этого в некотором php-коде:
$text = renderPhpToString('hello.php', array('foo'=>'World'));
и в итоге
$text == 'Hello, World!'
Возможно ли это со стандартным PHP 5? Очевидно, мне нужны более сложные шаблоны с циклами и т. Д.
Вы можете использовать некоторую функцию:
function renderPhpToString($file, $vars=null) { if (is_array($vars) && !empty($vars)) { extract($vars); } ob_start(); include $file; return ob_get_clean(); }
Он использует функцию управления буфером вывода ob_start()
для буферизации следующего вывода, пока он не будет возвращен ob_get_clean()
.
Редактировать Убедитесь, что вы проверяете данные, переданные этой функции, так что $vars
не имеет элемента file
который бы переопределил переданное значение аргумента $file
.
http://www.devshed.com/c/a/PHP/Output-Buffering-With-PHP/
Буферизация вывода может быть местом начала.
Поскольку Gumbo сказал, что вам нужно проверить переменную $ file, ее тонкая ошибка, которая уже укусила меня. Я бы использовал func_get_arg (i) и вообще не имел переменных, и второстепенное, я бы использовал require.
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(); }
относительно передачи $vars = array('file' => '/etc/passwd');
, вы можете использовать extract($vars, EXTR_SKIP);
Вы можете сделать это с буферизацией вывода , но может быть лучше использовать один из многих механизмов шаблонов.