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。

posted @ 2015-01-23 15:30  leezhxing  阅读(557)  评论(0编辑  收藏  举报