缘由:
composer自动引入
定义:
首先spl_autoload_register的官方定义:注册给定的函数作为 __autoload 的实现。
可以理解为替代_autoload函数的方案;
函数的使用:
关于spl_autoload_register的使用如下:
文件1:ClassTest.php
<?php
Class classTest
{
public function go()
{
echo 'success';
}
}
文件2:index.php
使用__autoload函数
<?php
funciton __autoload($class)
{
$file = $class.'.php';
require_one($file);
}
$obj = new ClassTest();
$obj->go();
执行index.php文件,
得到结果 字符串success,
php在加载为定义的类的时候会触发_autoload函数;
文件3: index.php
<?php
function loadprint($class) {
$file = $class.'.php';
require_once ($file);
}
spl_autoload_register('loadprint');
$obj = new classTest();
$obj->go();
执行index.php文件,
得到结果: 字符串success,
我们自定义了函数作为_autoload的实现,与autolod实现相同的功能;
那么!
__autoload与spl_autoload_register功能一样,为什么不只存在一个呢。
查看官方文档有这样的解释:
尽管 __autoload() 函数也能自动加载类和接口,但更建议使用 spl_autoload_register() 函数。 spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载(同一个应用中,可以支持任意数量的加载器,比如第三方库中的)。因此,不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用。
同时:
请查看以下例子:
文件1:index.php
spl_autoload_register('loadprint');
function __autoload($class) {
$file = 'classTest.php';
require_once ($file);
}
function loadprint($class) {
$file = 'classTest2.php';
require_once ($file);
}
$obj = new classTest();
$obj->go();
文件2:ClassTest.php
<?php
class classTest
{
public function go()
{
echo 'success1';
}
}
文件3:ClassTest.php
<?php
class classTest
{
public function go()
{
echo 'success2';
}
}
执行index.php
结果:success2。
这部分内容涉及到了php的生命周期,
spl_autoload_register涉及到注册函数队列(php生命周期运行中会对函数的注册表进行检查),如果你代码中既含有__autoload函数,又含有spl_autoload_register函数,则spl_autoload_register会取代__autoload。
spl_autoload_register更加灵活的实现了自动加载,同时在composer自动引入中也用到了大量的spl_autoload_register函数来实现,其实自动加载的最终原理还是require_one来实现。