在PHP中包含整个目录或使用通配符在PHP Include中使用?

9

我有一个用php编写的命令解释器。它位于commands目录中,需要访问命令文件中的每个命令。目前,我对每个命令都调用一次require_once。

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

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

有没有一种方法可以通过单个require_once命令包含所有这些命令?我在代码中的许多其他地方(如工厂、构建器和其他解释器)都遇到了类似的问题。该目录中除了命令之外没有其他内容,而解释器需要该目录中的每个文件。是否可以在require中使用通配符?例如:

require_once('*.php');

class Interpreter { //etc }

有没有其他方法可以避免在文件顶部写上二十行include的呢?

5个回答

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

我会小心使用这样的方法,总是更倾向于手动包含文件。如果这太过繁琐,也许需要进行一些重构。另一种解决方案可能是自动加载类


像上面的全局通配符操作有什么风险? - Daniel Bingham
1
@Daniel:很有可能你会需要很多未使用的资源。 - fabrik
5
如果有人能够在其中一个包含目录中放置一个 .php 文件,可能通过利用其他地方的漏洞,这将使您容易受到安全漏洞的攻击。这也会使您更难追踪包含了哪些内容。 - deceze
@daniel:我会尝试有条件地仅包含所需的文件。请查看下面的答案。 - thomasmalt
@fabrik 这里不太可能,目录结构设计得如此,以至于该目录仅包含由该解释器使用的命令文件。没有多余的东西。 - Daniel Bingham
永远不要这样做...我现在正在处理大量的遗留代码,如果有人这样做了,我会哭的。 - don.najd

8

你不能使用通配符 require_once,但是你可以编写程序来查找该目录中的所有文件并在循环中要求它们。

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

http://php.net/glob


6

为什么要这样做呢?只在需要时包含库以增加速度和减少占用空间不是更好的解决方案吗?

类似于这样:

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.
    }
}

1
非常出色。我想不到那个 - 我相当愚蠢,因为我的命名和目录结构已经设置好了以完全做到这一点。我只是没有想到有条件地包含。我想这又是我旧的C思维方式再次给我带来问题... - Daniel Bingham
8
一种自动加载的解决方案可能会更加优雅。 - Gordon
我同意,但前提是每个 Command<Foo>.php 文件中的代码都必须是面向对象的。 - thomasmalt

2
您可以使用 foreach() 函数来包含所有文件。
将所有文件名存储在数组中。
$array =  array('read','test');

foreach ($array as $value) {
    include_once $value.".php";
}

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接