【问题标题】:Including a whole directory in PHP or Wildcard for use in PHP Include?在 PHP 或通配符中包含整个目录以供 PHP 包含?
【发布时间】:2011-04-15 01:16:02
【问题描述】:

我在 php 中有一个命令解释器。它位于命令目录中,需要访问命令文件中的每个命令。目前我在每个命令上调用一次require。

require_once('CommandA.php');
require_once('CommandB.php');
require_once('CommandC.php');

class Interpreter {
    // Interprets input and calls the required commands.
}

有没有办法在一个 require_once 中包含所有这些命令?我的代码中的许多其他地方都有类似的问题(工厂、构建器、其他解释器)。该目录中只有命令,解释器需要该目录中的所有其他文件。是否有可以在要求中使用的通配符?如:

require_once('*.php');

class Interpreter { //etc }

是否有任何其他方法不涉及文件顶部的二十行包含?

【问题讨论】:

    标签: php include wildcard require


    【解决方案1】:

    您可以使用 foreach () 包含所有文件
    将所有文件名存储在数组中。

    $array =  array('read','test');
    
    foreach ($array as $value) {
        include_once $value.".php";
    }
    

    【讨论】:

      【解决方案2】:
      foreach (glob("*.php") as $filename) {
          require_once $filename;
      }
      

      不过,我会小心处理类似的事情,并且总是更喜欢“手动”包括文件。如果这太繁琐,也许需要进行一些重构。另一个解决方案可能是autoload classes

      【讨论】:

      • 做类似上述 glob 的事情有什么危险?
      • @Daniel:很有可能您需要大量未使用的资源。
      • 如果有人能够将 .php 文件放置在其中一个包含目录中,可能是通过利用某个地方的另一个漏洞,它会给您带来安全漏洞。这也使得跟踪包含的内容变得更加困难。
      • @daniel:我会尽量只包含需要的文件。请参阅下面的答案。
      • @fabrik 不太可能在这里,目录结构被设计为该目录仅包含该解释器使用的命令文件。不多也不少。
      【解决方案3】:

      您不能 require_once 通配符,但您可以通过编程方式找到该目录中的所有文件,然后循环使用它们

      foreach (glob("*.php") as $filename) {
          require_once($filename) ;
      }
      

      http://php.net/glob

      【讨论】:

        【解决方案4】:

        你为什么要这样做?仅在需要提高速度和减少占用空间时才包含库不是更好的解决方案吗?

        类似这样的:

        Class Interpreter 
        {
            public function __construct($command = null)
            {
                $file = 'Command'.$command.'.php';
        
                if (!file_exists($file)) {
                     throw new Exception('Invalid command passed to constructor');
                }
        
                include_once $file;
        
                // do other code here.
            }
        }
        

        【讨论】:

        • 太棒了。不会想到那个——我太愚蠢了,因为我的命名和目录结构已经设置为可以做到这一点。我只是不会想到有条件地包括。猜猜那是我的旧 C 思维模式又给我带来了问题......
        • autoload 解决方案会更优雅一些。
        • 我同意,但前提是每个 Command.php 中的代码都是面向对象的。
        【解决方案5】:

        现在是 2015 年,所以您很可能运行 PHP >= 5。如果是这样,正如上面多次提到的,PHP 的自动加载功能是一个很好的解决方案,可能是最好的。它是专门创建的,因此您不必编写用于自动加载的实用程序函数。但是,正如 PHP 文档中所提到的,__autoload 不再被推荐,并且可能在未来的版本中被贬值。只要您使用 PHP >= 5.1.2,请改用 spl_autoload_register

        【讨论】:

          猜你喜欢
          • 2011-12-26
          • 1970-01-01
          • 1970-01-01
          • 2010-12-25
          • 2014-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-13
          相关资源
          最近更新 更多