Fork me on GitHub

PHP进阶基础知识剖析(三)之自动加载

雄心壮志是茫茫黑夜中的北斗星
罗·勃朗宁

前言

这次我们来介绍又一种很有趣的技术,叫做自动加载,也是实现动态引入文件的技术。好吧,话不多说,让我们进入它的世界!

那么本期要讲述的是关于自动加载的知识

介绍

来源:
在编写面向对象(OOP) 程序时,很多开发者为每个类新建一个 PHP 文件。 这会带来一个烦恼:每个脚本的开头,都需要包含(include)一个长长的列表(每个类都有个文件)。


自动加载,顾名思义,不是静态的靠include/require引入,而是自动的将需要的类引入进来,这就需要依赖一个神奇的函数:

spl_autoload_register

spl_autoload_register

该函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载。通过注册自动加载器,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
请看下方函数定义!

1
2
3
4
5
6
7
8
9
10
11
12
bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

autoload_function
欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()。

throw
此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。

prepend
如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。

void __autoload ( string $class )//这个函数来启动自动加载,但用这个注册的话只能注册一个函数就是它本身,而spl_register_autoload则可以注册任意个自定义的autoload

实际上此函数是注册用户自定义的函数作为__autoload去使用,而此函数相当于建立了一个__autoload类型的队列,而__autoload函数底层就是加载未定义的类

代码示例

下面的示例代码就是很典型的框架中为了引入外部的类而作的自动加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public static function autoload($className)
{
$className = str_replace('\\','/',ltrim($className,'\\'));
$lastPos = strrpos($className,'/');
$classDir = substr($className,0,$lastPos);//从0开始,长度为$lastPos
$classPublic = $classDir.'/public/'.substr($className,$lastPos+1);
$classPrivate = $classDir.'/private/'.substr($className,$lastPos+1);
if (isset(self::$classMap[$className])) {
return true;
} else {
if (is_file(PROJECT_PATH."/".$className.".php")) {
require_once PROJECT_PATH."/".$className.".php";
self::$classMap[$className] = $className;
return true;
}
if (is_file(PROJECT_PATH."/".$classPrivate.".php")) {
require_once PROJECT_PATH."/".$classPrivate.".php";
self::$classMap[$className] = $className;
return true;
}
if (is_file(PROJECT_PATH."/".$classPublic.".php")) {
require_once PROJECT_PATH."/".$classPublic.".php";
self::$classMap[$className] = $className;
return true;
} else {
$str = "没找到对应的文件\n";
self::exceptionHandle($str);
return false;
}
}
}
spl_autoload_register('self::autoload');

其他

SPL Autoload 具体有几个函数:

  1. spl_autoload_register:注册 _autoload() 函数
  2. spl_autoload_unregister:注销已注册的函数
  3. spl_autoload_functions:返回所有已注册的函数
  4. spl_autoload_call:尝试所有已注册的函数来加载类
  5. spl_autoload :_autoload() 的默认实现
  6. spl_autoload_extionsions: 注册并返回 spl_autoload 函数使用的默认文件扩展名。

详细的信息请查看php.net!!

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!
0%