2009-04-17 5 views
16

나는이 같은 hello.php 파일이있는 경우 :PHP 파일을 변수로 렌더링 할 수 있습니까?

Hello, <?php echo $foo; ?>! 
나는 약간의 PHP 코드 같은 것을 할 싶습니다

:

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

$text == 'Hello, World!' 
와 끝까지

표준 PHP 5에서 가능합니까? 분명히 나는 ​​

답변

36

는이 같은 일부 기능을 사용할 수 있습니다

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

그것은이 ob_get_clean()에 의해 반환 될 때까지 다음과 같은 출력을 버퍼 출력 버퍼 제어 기능 ob_start()를 사용합니다.

편집$vars이 전달 $file 인수 값을 대체 할 것 file 요소가되지 않도록이 함수에 전달 된 데이터의 유효성을 검사 있는지 확인합니다.

+3

더 나은 희망 누군가가 $ 바르 = 배열 ​​('파일'=> 'http://example.com/hax.php') –

+0

를 전송하지 않습니다 사용할 수 있습니다 이게 내가 원하는거야. 필자의 경우 사용자 입력에 대해 걱정할 필요가 없습니다. 감사! – danb

+1

>> 필자의 경우 사용자 입력에 대해 걱정할 필요가 없습니다. 사용자 입력에 대해 걱정하지 않아도됩니다. 미래의 개발자는 $ vars = array ('file'=> 'http://example.com/whoops.php') 함수를 호출 할 수 있고,이 함수를 언 제고하는 데 꽤 많은 시간을 할애 할 수 있습니다. –

1

이 작업은 output buffering으로 수행 할 수 있지만 많은 템플릿 엔진 중 하나를 사용하는 것이 좋습니다.

2

Gumbo가 말한 것처럼 $ file 변수는 이미 저를 물었던 미묘한 버그입니다. 나는 func_get_arg (i)를 사용할 것이고 전혀 변수를 가지지 않을 것이다. 그리고 사소한 일, 나는 require를 사용할 것이다. $vars = array('file' => '/etc/passwd'); 전달에 관한

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

왜'$ vars = []'를 만들지 않는가? –

2

, 당신은 extract($vars, EXTR_SKIP);

+0

IMHO 당신이'EXTR_SKIP'을 필요로한다고 생각한다면 더 나은 해결책이 없는지 고려해야합니다. –

관련 문제