0

文件夹结构如下:

/main.php
  /lib/class1.php
  /lib/class2.php
  /lib/class3.php

我想让 main.php 使 lib 中的所有类都可用,而无需执行大量的 require/include。这可能吗?是否可以仅包含目录中的所有文件?

4

6 回答 6

0

是的,是的,这完全有可能而且很容易做到。最好的方法是利用http://uk1.php.net/autoload

于 2013-05-15T14:38:15.173 回答
0

我建议您使用@Puciek 建议的自动加载功能。

如果您对自己做这件事感到好奇,您可以执行以下操作:

$path = "lib/";

foreach(new \DirectoryIterator($path) as $lib){
    if(strstr($lib->getFilename(), ".php")){
        require_once $path.$lib->getFilename();
    }
}

以上将使用DirectoryIteratorPHP SPL 的一部分。

于 2013-05-15T14:42:26.007 回答
0
$path = '/lib/';

$dir = new DirectoryIterator($path);
foreach($dir as $spl){
    if($spl->getExtension() != 'php') continue;
    include($spl);
}

基本上,我遍历了目录的文件,过滤掉了非 php 文件,然后将它们包含在内。您可以随意添加更多过滤器,例如以“类”开头的文件作为文件名。

您还可以查看glob()php 的函数,它返回一个包含目录中所有文件的数组:

http://it2.php.net/manual/en/function.glob.php


目录迭代器的好处是,如果需要,您可以使用 RecursiveDirectoryIterator 和 RecursiveIteratorIterator 以类似的方式遍历目录树,以获取所有文件。

于 2013-05-15T14:43:34.293 回答
0

自动加载将是一个不错的选择,但假设有一种方法可以将类名映射到文件名,如果这是一个选项,您应该遵循@puciek 的建议。

其他选项是创建一个包含您想要的所有文件的单个包含,例如在 /lib 中创建一个名为 all.php 的文件并将其定义为

include("class1.php");
include("class2.php");
include("class3.php");

然后在你的脚本中你可以只包含(“lib/all.php”);

另一种选择是将目录中的文件全局化,然后遍历生成的数组并发出包含。

$includes = glob("lib/*.php");
foreach($inclues as $inc){
    include($inc);
}
于 2013-05-15T14:43:53.677 回答
0

使用延迟加载而不是导入所有内容 - http://php.net/manual/en/function.spl-autoload-register.php

function autoload($sClass) {
    $sPath = str_replace('_', DIRECTORY_SEPARATOR, $sClass) . '.php';
    require_once($sPath);
}
spl_autoload_register('autoload');

new My_Class();

这是一个非常精简的例子,但它是可以构建的。理想情况下,您会检查文件是否存在于包含路径(http://php.net/manual/en/function.stream-resolve-include-path.php)上,检查文件是否可读,需要/包含成功并且该类在自动加载结束时存在

于 2013-05-15T14:44:34.930 回答
0

创建一个自动加载函数以直接从您的 URL 加载类

function __autoload($class_name) {
    include "/lib/".$class_name . '.php'; //Add your folder structure like this
            // ^ Change the path to your specific need
}

//Then Simply
$class1_object = new Class1(); 
于 2013-05-15T14:46:59.183 回答