Autoload类的自动加载

类的自动加载

PHP面向对象程序设计过程中,必然需要定义很多类,也就是非常多的.PHP文件。在PHP5之前,我们如果在一个类中引用另一个类,需要在这个类的文件头部加上require或者include。但是,如果我们的系统非常复杂,涉及极多的类时,这样的操作显得非常繁琐。

在PHP5中,已经不再需要这样了。 spl_autoload_register() 函数可以注册任意数量的自动加载器,当使用尚未被定义的类和接口时自动去加载。通过注册自动加载器,脚本引擎在PHP出错失败前有了最后一个机会加载所需的类。


尝试分别从 MyClass1.phpMyClass2.php 文件中加载 MyClass1MyClass2

1
2
3
4
5
6
7
8
<?php
spl_autoload_register(function ($class_name) {
require_once $class_name . '.php';
});

$obj = new MyClass1();
$obj2 = new MyClass2();
?>

将一个异常抛给不存在的自定义异常处理函数

1
2
3
4
5
6
7
8
9
10
11
12
<?php
spl_autoload_register(function ($name) {
echo "Want to load $name.\n";
throw new MissingException("Unable to load $name.");
});

try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>

Composer 自动加载

composer 提供了四种自动加载类型

  • classmap
  • psr-0
  • psr-4
  • files

这几种自动加载平常的框架都用到,通常来看,项目代码用psr-4自动加载, 如Laravel框架的函数库helperfiles自动加载,development相关用classmap自动加载,而psr-0已经弃用,有事兼容古老的代码还会用到。

classmap

composer会扫描指定目录下以.php.inc结尾的文件中的class,生成class到指定file-path的映射(Key-Value),并加入新生成的vendor/composer/autoload_classmap.php文件中

例如:

配置扫描路径src

1
2
3
4
5
{
"autoload": {
"classmap": ["src/"]
}
}

其生成结果如下

1
2
3
4
5
<?php
return array(
'BaseController' => $baseDir . '/src/BaseController.php'
);
?>

psr-4

composer.json里是这样进行配置的:

1
2
3
4
5
6
7
{
"autoload": {
"psr-4": {
"Foo\\": "src/"
}
}
}

执行composer install更新自动加载。照PSR-4的规则,当在index.php中试图new Foo\Bar\Baz这个class时,composer会自动去寻找 src/Bar/Baz.php" 这个文件,如果它存在则进行加载。

files

1
2
3
4
5
{
"autoload": {
"files": ["src/MyLibrary/functions.php"]
}
}

执行composer install更新自动加载。Files方式,就是手动指定供直接加载的文件。比如说我们有一系列全局的helper functions,可以放到一个helper文件里然后直接进行加载,也就是说,当你用require 'vendor/autoload.php'加载自动加载类时自动将files里的文件加载进来了,你直接使用就行了。