Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP自动加载带有目录的类?_Php_Oop - Fatal编程技术网

PHP自动加载带有目录的类?

PHP自动加载带有目录的类?,php,oop,Php,Oop,这是我当前的自动加载器: function classAutoLoad($class) { if (file_exists($_SERVER['DOCUMENT_ROOT']."/framework/includes/class/$class.class.php")) include($_SERVER['DOCUMENT_ROOT']."/framework/includes/class/".$class.".class.php"); } spl_autoload_re

这是我当前的自动加载器:

function classAutoLoad($class) {
    if (file_exists($_SERVER['DOCUMENT_ROOT']."/framework/includes/class/$class.class.php"))
        include($_SERVER['DOCUMENT_ROOT']."/framework/includes/class/".$class.".class.php");
}

spl_autoload_register('classAutoload');
用法:

$class = new Classname;
基本上,它将加载/class/中的所有类,不包括目录。 我想做的是,更干净

我有很多类,我想把它们打包到目录中


如何在此处启用对软件包的支持?或者有一个流行的类库吗?

您必须想出一些方法将类名映射到文件。您可以通过维护关联数组来显式地实现这一点,也可以使用类似的约定。PSR-0声明名称空间应该转换为传递给自动加载程序的
$class
中的目录,这样您就可以用系统的目录分隔符替换名称空间分隔符
\

您的代码似乎更适合您尝试执行的操作,加载到一个特定的目录中。但是,如果(file_exists(…){…},我将更改
,以在文件不存在时触发错误。差不多

if (file_exists(...)) {
    ...
} else {
    throw new RuntimeException($class . ' could not be found.');
}
您可以查看我使用的自动加载脚本。这将考虑名称空间,并且可以修改为仅查看
*.class.php

要使用它:

require_once($_SERVER['DOCUMENT_ROOT']."/path/to/Utilities/Loader.php");
\Utilities\Loader::register();

$class = \Namespace\ClassName();

如果自动加载器不必是完全动态的,您可以简单地使用。它扫描整个目录并自动创建静态类到文件名的映射,大致如下所示:

spl_autoload_register(function($class) {
    static $classes = null;
    if ($classes === null) {
        $classes = array(
            'my\\first\\class' => 'My/First/Class.php',
            'my\\secondclass' => 'My/SecondClass.php'
        );
    }
    $cn = strtolower($class);
    if (isset($classes[$cn])) {
        require __DIR__ . $classes[$cn];
    }
});
优点:

  • 快速而健壮
  • 灵活性(基本上,您可以使用任何喜欢的命名约定)
缺点:

  • 每次添加、删除或重命名类时都需要重新运行
例如,将使用加载类(还有其他的,这里最重要的可能是命名约定)。