php入门--自动加载函数

之所以要使用自动加载函数,是因为当有外部类需要依赖时如果不使用自动加载函数就只能使用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需要执行时,例如上面例子,执行的结果就是:

《php入门--自动加载函数》 按代码顺序的执行结果

而如果将
spl_autoload_register的顺序换成
spl_autoload_register('autoload1');

在最前面则执行结果会变成:

《php入门--自动加载函数》 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"
}
    原文作者:joooooe
    原文地址: https://www.jianshu.com/p/6b37a8df7543
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞