php函数spl_autoload_register

缘由:
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来实现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值