spl_autoload_register()怎样注册多个自动加载函数?

agui1989
  • 4.5k
<?php 

/*function __autoload($class){
    require("./class/".$class.".php");
}*/

function auto($class){
    require("./class/".$class.".php");
}
function aa($class){
    require("./class2/".$class.".php");
}

spl_autoload_register("auto");
spl_autoload_register("aa");

$cc=spl_autoload_functions();
var_dump($cc);

$a=new c();
$a->index();




 ?>

输出:

array(2) { [0]=> string(4) "auto" [1]=> string(2) "aa" } 
Warning: require(./class/c.php): failed to open stream: No such file or directory in D:\www\a\auto.php on line 8

Fatal error: require(): Failed opening required './class/c.php' (include_path='.;C:\php\pear') in D:\www\a\auto.php on line 8

文件:
图片描述

回复
阅读 5.3k
3 个回答
✓ 已被采纳

require之前要先判断文件是否存在哦

function auto($class){
    if(file_exists("./class/".$class.".php")) {
        require("./class/".$class.".php");
    }
}
function aa($class){
    if(file_exists("./class2/".$class.".php")) {
        require("./class2/".$class.".php");
    }
}
Warning: require(./class/c.php): failed to open stream: No such file or directory
你的c.php 文件明明是在 class2目录下面的啊,这么明显的错误

spl_autoload_register函数将auto和aa两个函数注册到spl自动加载队列中,这个队列是有顺序的,所以你这里new c() 实际上执行的auto函数(此处队列auto在前,如果想要aa函数在前,可以将spl_autoload_register的第三个参数设为true)。
实际上底层执行了spl_autoload_all函数,用于执行队列中所有的__autoload函数,就像第一个答主说的,使用file_exists只是为了保证不报错。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏