【问题标题】:How to run php code from file_get_contents or file in a function如何从 file_get_contents 或函数中的文件运行 php 代码
【发布时间】:2012-01-18 08:33:21
【问题描述】:

我正在设计自己的 MVC 模式来简化创建主页的过程。我的模板系统需要我的控制器类来输出我的视图。这意味着我必须通过 php 函数输出文件。我已经搜索了一段时间,似乎无法找到解决方案。

如何通过 PHP 函数将表示某些源代码(“”、“”等)的字符串作为 php 运行? eval 不会接受我的

【问题讨论】:

    标签: php templates model-view-controller file-io eval


    【解决方案1】:

    您可以执行 php 代码并像这样收集输出:

    ob_start();
    include "template.phtml";
    $out1 = ob_get_clean();
    

    http://www.php.net/manual/de/function.ob-get-contents.php

    【讨论】:

    • 也可以用$out1 = ob_get_clean();替换最后两行
    • 工作正常。如果部分代码有 $this 怎么办?
    • @TadeuszMajkowski:如果代码中有$this,它就是类的方法。您可以在调用对象的方法时执行相同的操作。如果您对此有疑问,请创建一个新问题以获得帮助。
    【解决方案2】:

    只是包含()文件应该没问题。我没有深入研究源代码,但我相当确定 Zend Framework 就是这样实现模板的。

    【讨论】:

      【解决方案3】:

      按照 GordonM 的建议,将“echo file_get_contents()”替换为“include()”完全符合需要。还不能投票,因为我太新了,但出于我的需要,这是标题问题的直接答案。

      【讨论】:

        【解决方案4】:
        $code = '<?php
        function GetBetween($content, $start, $end) {
          $r = explode($start, $content);
          if (isset($r[1])){
            $r = explode($end, $r[1]);
            return $r[0];
          }
          return '';
        }';
        
        function _readphp_eval($code) {
          ob_start();
          print eval('?>'. $code);
          $output = ob_get_contents();
          ob_end_clean();
          return $output;
        }
        
        print _readphp_eval($code);
        

        【讨论】:

        • 永远不要在 PHP 脚本中使用 eval,除非你 100% 确定没有其他方法
        【解决方案5】:

        嗯,eval 本身并不是废话,如果你不小心你在 eval 中允许的内容,很容易用它创建一个安全漏洞(那个,也许它可能不利于可读性的事实代码)。

        至于&lt;? 标志,那是因为eval 需要php 代码,所以如果你不想将php 与普通输出混合,只包括结束?&gt; 标记。

        不过,一般来说,您可以以更好的方式实现模板,尝试研究输出缓冲。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-07
          • 1970-01-01
          相关资源
          最近更新 更多