PHP类的自动加载

本文深入探讨了PHP中的类自动加载机制,包括弃用的__autoload函数和推荐使用的spl_autoload_register函数。介绍了如何使用这两种方法来自动加载类,并展示了在命名空间环境下自动加载的实现方式。

__autoload

尝试加载未定义的类,PHP7.2弃用此函数。假定同一目录下有foo.php和test.php两个文件。

PHP5.3以前__autoload函数抛出的异常不能被catch语句块捕获并会导致一个致命错误。PHP5.3起能够thrown自定义的异常,随后自定义异常类即可使用。__autoload函数可以递归的自动加载自定义异常类。

//foo.php
<?php
class Foo{
	function __construct(){
		echo __CLASS__ ." in ". __FILE__ ."<br/>";
	}
}

class Bar{
	function __construct(){
		echo __CLASS__ ." in ". __FILE__ ."<br/>";
	}
}
interface ITest{
	public function test();
}
?>
//test.php
<?php
function __autoload($className){
    $filename = "./". $className .".php";
    include_once($filename);
}
$foo=new Foo();
$bar=new Bar();
?>

要注意的是如果test.php中最后两行顺序颠倒的话会产生致命错误,因为Bar定义在foo.php中,无法通过__autoload加载。

spl_autoload_register

将函数注册到SPL的__autoload函数队列中。如果该队列中的函数尚未激活,则激活它们。spl_autoload_register创建了一个autoload函数的队列,按定义时的顺序逐个执行。而__autoload函数只可以定义一次。如果程序中已经实现了__autoload函数,必须显式的将其注册到__autoload函数队列中。因为spl_autoload_register函数会将Zend Engine中的__autoload函数取代为spl_autoload或spl_autoload_call。

最多接受三个参数,第一个参数为要注册的自动装载函数,默认为spl_autoload();第二个参数为要注册的自动装载函数无法成功注册时,spl_autoload_register是否抛出异常,默认为true;第三个参数为PHP5.3新增的标识参数,表示要注册的自动装载函数是否添加到函数队列之首,默认为false。注册成功返回true,失败返回false。

PHP5.3起,还支持匿名函数和命名空间。

//test2.php
<?php
function my_autoload($className){
	$filename = "./". $className .".php";
    include_once($filename);
}
spl_autoload_register('my_autoload');

//PHP5.3支持匿名函数
spl_autoload_register(function($className){
	$filename = "./". $className .".php";
    include_once($filename);
},true,true);


$foo=new Foo();
$bar=new Bar();

class MyTest implements ITest{
	public function test(){
		echo "mytest</br>";
	}
}
$t=new MyTest();
$t->test();
?>
//test3.php
<?php
namespace ns;

function my_autoload($className){
	$filename = "./". $className .".php";
    include_once($filename);
}
spl_autoload_register(__NAMESPACE__ .'\my_autoload');

$foo=new \Foo();
$bar=new \Bar();

?>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值