之所以要使用自动加载函数,是因为当有外部类需要依赖时如果不使用自动加载函数就只能使用require XXX.php
这样引入一个文件的依赖,但是这样做的问题在于如果需要大量的类的引入,就需要写数个这样的文件,并且如果有相关的类被删除了,require关键字会造成错误。
function __autoload($class){
require __DIR__.'/'.$class.'.php';
}
但是事实上这样的方式(autoload并不常用):
在php5.3以前自动加载函数是使用__autoload()
来实现的,但随着各种框架的引入和业务逻辑的逐渐复杂,这个函数的一个问题显现出来,就是当不同框架引入了多个__autoload()函数时,就会报出函数重复定义的致命错误。
而这个问题在php5.3被解决,使用spl_autoload_register
关键字来取代autoload()
函数,这样做可以定义多个自动加载函数。这样每个类就可以分别执行自己的载入函数。
<?php
/**
* Created by PhpStorm.
* User: Jo
* Date: 3/31/17
* Time: 5:27 PM
*/
spl_autoload_register('autoload3');
spl_autoload_register('autoload2');
spl_autoload_register('autoload1');
//require '/Applications/XAMPP/xamppfiles/htdocs/demo/test1.php';
//require '/Applications/XAMPP/xamppfiles/htdocs/demo/test2.php';
test1 :: test();
function autoload1($class){
require __DIR__.'/'.$class.'.php';
}
function autoload2($class){
echo "hello world";
}
function autoload3($class){
echo "test";
}
另外一个重点就是spl_autoload_register的执行顺序,当有多个spl_autoload_register需要执行时,例如上面例子,执行的结果就是:
而如果将
spl_autoload_register
的顺序换成spl_autoload_register('autoload1');
在最前面则执行结果会变成:
之所以会出现这样的不同是和多个spl_autoload_register的使用顺序有关:
执行顺序是按照注册的顺序,一个一个往下找,如果找到了就停止。
即在本例中找test1这个类,找到就停止。同时可以使用var_dump(spl_autoload_functions());
来打印出自动加载的顺序
array(3) {
[0]=>
string(9) "autoload1"
[1]=>
string(9) "autoload3"
[2]=>
string(9) "autoload2"
}