【问题标题】:Can you render a PHP file into a variable?您可以将 PHP 文件渲染为变量吗?
【发布时间】:2016-11-19 18:41:49
【问题描述】:

如果我有这样的 hello.php 文件:

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

我想在一些 php 代码中做这样的事情:

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

最终得到

$text == 'Hello, World!'

这在标准 PHP 5 中是否可行?显然我想要更复杂的带有循环的模板等等..

【问题讨论】:

    标签: php


    【解决方案1】:

    你可以使用这样的函数:

    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 元素。

    【讨论】:

    • 希望有人不要发送 $vars = array('file' => 'example.com/hax.php')
    • 这正是我要找的。就我而言,无需担心用户输入。谢谢!
    • >>就我而言,无需担心用户输入。您不仅担心这里的用户输入;未来的开发人员可以使用 $vars = array('file' => 'example.com/whoops.php') 调用该函数,然后花费大量时间调试它。
    • @rmbarnes:这有点太偏执了。如果未来的开发者是个白痴,那么他可以在世界上花费所有时间来尝试修复自己的错误。 :)
    • 顺便说一句 - 只需让 $file$bargle 一样无害,而不用担心验证输入。
    【解决方案2】:

    正如 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=[]
    【解决方案3】:

    http://www.devshed.com/c/a/PHP/Output-Buffering-With-PHP/

    输出缓冲可能是开始的地方。

    【讨论】:

      【解决方案4】:

      关于传递$vars = array('file' =&gt; '/etc/passwd');,你可以使用extract($vars, EXTR_SKIP);

      【讨论】:

      • 恕我直言,如果您认为您可能需要EXTR_SKIP,您应该考虑是否没有更好的解决方案。
      【解决方案5】:

      您可以使用 output buffering 执行此操作,但使用众多模板引擎之一可能会更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-04
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-01
        • 2022-01-19
        相关资源
        最近更新 更多