SPL--spl_autoload_register
spl_autoload_register() :
调用未定义类时,系统会按顺序调用注册到spl_autoload_register()函数的所有函数,而不是调用__autoload函数。
解决问题:
函数__autoload($classname)可以做到动态的加载类,可以避免使用require_once语句,但如果拥有一个大规模的应用程序,其中包含了库或者较小的应用程序,那么每个应用程序可能都希望声明一个__autoload函数去查找他的文件。问题在于,在全局范围内声明两个__autoload()函数会产生重复声明的错误。
Usage:
spl函数接受3个参数:[ 添加到自动加载栈的函数, 加载器不能找到这个类时是否抛出异常的标志 = true,注册到队首而不是队尾 = false ]
第一个参数可选,默认指向spl_autoload(),这个函数会自动在路径中查找具有小写类名和.php或.ini扩展名的文件,或注册到spl_autoload_extensions()函数的其他扩展名。
<?php
define('CLASS_DIR', 'class/')
/*
* set_include_path 设置php包含文件的路径
* get_include_path 获取当前php包含文件的路径,默认.:/usr/share/pear:/usr/share/php //linux以:分割,win以;分割
* PATH_SEPARATOR 常量,代表当前系统的分隔符
*/
set_include_path(get_include_path().PATH_SEPARATOR.CLASS_DIR); //扩展php包含文件的路径
//注册并返回spl_autoload函数使用的默认文件扩展名,本函数用来修改和检查 __autoload() 函数内置的默认实现函数 spl_autoload() 所使用的扩展名,默认的spl_autoload函数使用的扩展名是".inc,.php"。
//spl_autoload_extensions('.class.php,inc,interface,.class'); //注册多个
spl_autoload_extensions('.class.php');
// 用默认方法
//spl_autoload_register(); //默认调用,默认抛出异常
spl_autoload_register(null, false); //用默认函数,未找到类时不抛出异常
spl_autoload_register('myLoader1', false);
spl_autoload_register('myLoader2', false);
//实例化类时,spl_autoload()先在包含路径中查找,这里的class/test.class.php存在,将会被include,如果不存在,将会调用myLoader1,2自定义函数,如果还是没找到,抛出一个没有被正确声明类异常。
$instance = new Test();
安全调用:
一旦调用了spl_autoload_register(), 程序中的__autoload()函数就不回被调用了,如果想保留__autoload()的功能,把其注册为自动加载栈中的第一个函数:
if( false === spl_autoload_function() ){ if( function_exists('__autoload') ){ spl_autoload_register('__autoload', false); } }
spl_autoload_function() : 返回已注册函数的数组,如果spl自动加载栈还没有初始化,返回false。