【问题标题】:require/include into variable要求/包含到变量中
【发布时间】:2011-05-10 10:02:16
【问题描述】:

我想要求/包含一个文件并将其内容检索到一个变量中。

test.php

<?php
echo "seconds passed since 01-01-1970 00:00 GMT is ".time();
?>

index.php

<?php
$test=require("test.php");
echo "the content of test.php is:<hr>".$test;
?>

类似于file_get_contents(),但它仍应执行 PHP 代码。 这可能吗?

【问题讨论】:

  • 可能是这样,但我想您可能想问问自己(或我们,如果需要)为什么需要这个,以及是否没有其他方法。你可以做各种各样的事情(比如使用 exec 或 php yourfile.php 执行它,然后检索结果),但可能有更好的方法来实际解决你的初始问题......
  • 它只是碰巧在我的情况下很方便。可能会有更好的方法,但我还没有学习它。现在,即使只是知道这种可能性就足够了,因为它确实扩展了我的知识。
  • @user746379,在您包含的文件中,只需执行return 'value';。它会起作用的。

标签: php


【解决方案1】:

如果您包含的文件返回了一个变量...

include.php

<?php
return 'abc';

...然后您可以将它分配给这样的变量...

$abc = include 'include.php';

否则,使用输出缓冲。

ob_start();
include 'include.php';
$buffer = ob_get_clean();

【讨论】:

  • 为什么不使用ob_get_clean() 来获取内容并立即停止缓冲?
  • @Slava Cheers,代码来自记忆,我想我需要再次查看文档:)
  • 啊,好的。我以为背后有一些我不知道的东西:)。
  • 好答案!我忘记了 php 文件中的纯 return
  • 在将包含的值赋值给变量后,在包含的文件中使用return很简单,这对我来说是最好的解决方案!
【解决方案2】:

我也遇到过这个问题,试试类似

<?php
function requireToVar($file){
    ob_start();
    require($file);
    return ob_get_clean();
}
$test=requireToVar($test);
?>

【讨论】:

  • 错了! ob_start() 启用打开输出缓冲,ob_clean() - 只是清理缓冲区并打开输出缓冲,这是错误的!要关闭它,请使用ob_end_clean() 而不是ob_clean()。或者,您可以使用ob_get_clean() 而不是ob_get_contents()ob_end_clean()。所以函数的主体看起来像ob_start(); require $file; return ob_get_clean();
  • 另外很高兴知道:ob_start 是可堆叠的,因此在已经在缓冲输出块内的代码中使用此方法是完全安全的。
  • 另外,require 不是函数,所以括号是多余的。
  • 但是如果我仍然试图访问一个变量呢?假设 test.php 将具有需要大量计算的超级复杂算法。我需要这个文件的内容在我的 var 中,如图所示,但也想访问在我的 test.php 中创建的变量。这意味着,首先我必须执行你的requireToVar($ifle),然后像平常一样包含该文件,这会导致我的代码的执行加倍。
【解决方案3】:

你可以在包含的文件中写:

<?php
    return 'seconds etc.';

并且在您包含的文件中:

<?php
    $text = include('file.php'); // just assigns value returned in file

【讨论】:

  • 这是将文件包含到变量中的几种类型需求的最佳解决方案。
  • 很好的解决方案,它对缓存文件很有用,所以我可以多次使用包含的文件而无需再次包含文件,我只需要打印出变量内容!我总是使用这种方法!谢谢!
【解决方案4】:

在 PHP/7 中,您可以使用自调用匿名函数来完成简单的封装并防止全局范围被随机全局变量污染:

return (function () {
    // Local variables (not exported)
    $current_time = time();
    $reference_time = '01-01-1970 00:00';

    return "seconds passed since $reference_time GMT is $current_time";
})();

PHP/5.3+ 的另一种语法是:

return call_user_func(function(){
    // Local variables (not exported)
    $current_time = time();
    $reference_time = '01-01-1970 00:00';

    return "seconds passed since $reference_time GMT is $current_time";
});

然后您可以像往常一样选择变量名称:

$banner = require 'test.php';

【讨论】:

  • 也适用于 PHP5。不确定是否需要,但我在语法 $banner = (require 'test.php'); 中使用了括号
  • @Alph.Dev 我相信it doesn'tAnonymous functions 相当古老,但自调用语法(我永远记不起实际名称)较新。但是,旧系统的语法也很简洁,所以我更新了答案。
  • 是的。 call_user_func(function( 确实可以在 PHP5 中运行。不幸的是,我不记得为什么了,但我们故意在(require 'file.php'); 周围使用括号,没有它们会导致一些问题。
  • @Alph.Dev include 文档只是说:“因为 include 是一种特殊的语言结构,所以它的参数不需要括号。比较返回值时要小心。”
【解决方案5】:

使用shell_exec("php test.php")。它返回执行的输出。

【讨论】:

    【解决方案6】:

    我认为eval(file_get_contents('include.php')) 可以帮助您。 请记住,可以在您的主机上禁用像 shell_exec 这样的其他执行方式。

    【讨论】:

      【解决方案7】:

      require/include 不返回文件的内容。您必须进行单独的调用才能实现您想要做的事情。

      编辑

      使用echo 不会让你做你想做的事。但是返回文件的内容将按照手册中的说明完成工作 - http://www.php.net/manual/en/function.include.php

      【讨论】:

      • 你确定吗? echo $buffer 给了我正确的内容?
      • 这家伙不知道他在说什么。包含是否返回正确的内容。
      • 对不起,我应该更清楚地说明使用 echo 不适用于 OP。使用return 构造将按照手册中的说明工作。已更新,谢谢。
      【解决方案8】:

      只有在需要或包含的 php 文件返回某些东西(数组、对象、字符串、int、变量等)时才有可能

      $var = require '/dir/file.php';
      

      但如果它不是 php 文件,而你想评估这个文件的内容,你可以:

      <?php
      
      function get_file($path){
      
          return eval(trim(str_replace(array('<?php', '?>'), '', file_get_contents($path))));
      }
      
      $var = get_file('/dir/file.php');
      

      【讨论】:

        【解决方案9】:

        或者可能是这样的

        在文件include.php中:

        <?php
          //include.php file
          $return .= "value1 ";
          $return .= time();
        

        在其他一些 php 文件中(不管这个文件的内容是什么):

        <?php
          // other.php file
          function() {
            $return = "Values are: ";
            include "path_to_file/include.php";
        
            return $return;
          }
        

        return 将如下所示:

        Values are: value1, 145635165
        

        关键是,包含文件的内容与我提供的示例中的函数内容具有相同的范围。

        【讨论】:

          猜你喜欢
          • 2015-12-18
          • 2016-08-04
          • 2011-11-25
          • 2012-08-07
          • 2011-07-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多