以下spl_autoload_register介绍,来自官方文档介绍说明:
地址:https://www.php.net/manual/zh/function.spl-autoload-register.php
spl_autoload_register
(PHP 5 >= 5.1.0, PHP 7)
spl_autoload_register — 注册给定的函数作为 __autoload 的实现
说明
spl_autoload_register ([ callable $autoload_function
[, bool $throw
= true [, bool $prepend
= false ]]] ) : bool
将函数注册到SPL __autoload函数队列中。如果该队列中的函数尚未激活,则激活它们。
如果在你的程序中已经实现了__autoload()函数,它必须显式注册到__autoload()队列中。因为 spl_autoload_register()函数会将Zend Engine中的__autoload()函数取代为spl_autoload()或spl_autoload_call()。
如果需要多条 autoload 函数,spl_autoload_register() 满足了此类需求。 它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。相比之下, __autoload() 只可以定义一次。
参数
autoload_function
欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()。
throw
此参数设置了 autoload_function
无法成功注册时, spl_autoload_register()是否抛出异常。
prepend
如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。
返回值
成功时返回 TRUE
, 或者在失败时返回 FALSE
。
核心示例代码:
<?php
use app\ClassD;
//定义根目录路径
define("ROOT",__DIR__.DIRECTORY_SEPARATOR);
/**
* 功能:自动装载类
* @author li914
*/
class AutoloadClass
{
/**
* 功能:自动装载静态方法
* @param string $className 类名 例如:ClassA 或 app/ClassD
* @return void
*/
public static function autoload($className)
{
$classPath = ROOT;
//获取 名称空间名称
$namespace = mb_substr($className,0,mb_strpos($className,"\\"));
//判断是否存在 名称空间
if (!empty($namespace)){
$classPath .= $namespace.DIRECTORY_SEPARATOR;
}
//判断是否 已存在类
if (class_exists($className)){
return;
}
//获取类名
$class = mb_substr($className,mb_strlen($namespace));
$classPath .= $class.".php";
if (file_exists($classPath)){
include_once $classPath;
}else{
//若未找到 则抛出异常
throw new RuntimeException("$className file $classPath not found!");
}
}
}
/**
* $autoload_function 自动加载方法
* $throw 是否抛出注册失败异常
* $prepend 是否放到队首
*/
spl_autoload_register('AutoloadClass::autoload',true,true);
$classA = new ClassA();
$classd = new ClassD();
具体的示例地址:https://github.com/li914/php_autoload