文件夹结构如下:
/main.php
/lib/class1.php
/lib/class2.php
/lib/class3.php
我想让 main.php 使 lib 中的所有类都可用,而无需执行大量的 require/include。这可能吗?是否可以仅包含目录中的所有文件?
是的,是的,这完全有可能而且很容易做到。最好的方法是利用http://uk1.php.net/autoload
我建议您使用@Puciek 建议的自动加载功能。
如果您对自己做这件事感到好奇,您可以执行以下操作:
$path = "lib/";
foreach(new \DirectoryIterator($path) as $lib){
if(strstr($lib->getFilename(), ".php")){
require_once $path.$lib->getFilename();
}
}
以上将使用DirectoryIterator
PHP SPL 的一部分。
$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 以类似的方式遍历目录树,以获取所有文件。
自动加载将是一个不错的选择,但假设有一种方法可以将类名映射到文件名,如果这是一个选项,您应该遵循@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);
}
使用延迟加载而不是导入所有内容 - 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)上,检查文件是否可读,需要/包含成功并且该类在自动加载结束时存在
创建一个自动加载函数以直接从您的 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();