__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();
?>