作者:lxm淡淡嘚甜_671 | 来源:互联网 | 2018-03-22 10:04
__autoload()是PHP执行环境中约定的一个函数而非某个类的方法,如果一个类在使用之前没有加载到当前文件,会自动调用__autoload()函数来加载该类,通常这些类的加载规则都是...
__autoload() 是PHP执行环境中约定的一个函数而非某个类的方法,如果一个类在使用之前没有加载到当前文件,会自动调用 __autoload() 函数来加载该类,通常这些类的加载规则都是约定的,比如这些类包含在以类名命名的文件内,该方法可以实现类的按需加载,避免脚本执行前加载不必要的类从而降低资源占用、提交性能。
注意:__autoload() 内的错误不能被 try-catch 捕获。
代码如下 |
|
function __autoload($class_name){ require_once(PATH.'/calsses/'.$class_name.'.php'); } $obj1 = new mycalss1(); |
注册 __autoload() 自动调用的函数:
spl 代码库在 PHP5.0 之后默认自动启用
spl_autoload_register([callback]); //不将具体实现的加载代码写在 __autoload() 内,可使用该函数注册回调函数。
如果使用类的方法作为回调函数需要传入一个数组:
代码如下 |
|
spl_autoload_register(array('class_name'|$obj,'method_name')); 例如: spl_autoload_register(array($this,'autoloadClass')); |
spl_autoload_register(array('YiiBase','autoload'));// YII 框架的自动加载类的实现, YiiBase 类实现了一个autoload 方法。 spl_autoload_register() 可以注册多个加载函数,成功加载类文件之前将逐个尝试所有注册的加载函数。这在不同的类使用不同逻辑来导入类文件的时候很有用。
spl_autoload_unregister(); //取消某个注册的加载函数,参数与 spl_autoload_register() 相同.
spl_autoload_functions();// 以数组形式返回所有注册的 __autoload() 函数
spl_autoload(class_name[,file_extentions]); // __autoload() 函数的默认实现。 spl_autoload_register() 被调用时如果没有传入 函数名,则默认使用该函数,该函数的执行规则是: 类名转为小写作为文件名,传入的 file_extentions(多个扩展名以逗号隔开,默认为 .inc 和 .php)为扩展名,根据得到的文件名尝试在 php.ini 内设置的 include paths 中搜索。
spl_autoload_call(class_name);//手动调用所有注册的 __autoload() 函数来主动加载类文件
spl_autoload_extentions([file_extentions]); //注册或返回 spl_autoload() 中可以使用的文件扩展名,扩展名可以是 .a.b 这样的形式,例如:
代码如下 |
|
spl_autoload_extentions(".class.php"); spl_autoload_register(); //使用spl_autoload() 来尝试自动加载类文件 //这样 spl_autoload('myclassName'); 会尝试加载 文件 "myclassName.class.php" . |
实例
1、将需要注册的类放在一个数组中
代码如下 |
|
final class Utils {
private function __construct() { } public static function getClasses($pre_path = '/') { $classes = array( 'DBConfig' => $pre_path.'DBConfig/DBConfig.php', 'User' => $pre_path.'Model/User.php', 'Dao' => $pre_path.'Dao/Dao.php', 'UserDao' => $pre_path.'Dao/UserDao.php', 'UserMapper' => $pre_path.'Mapping/UserMapper.php', ); return $classes; } } ?> |
2、注册数组
注意:步骤1中的类的路径都是相对于init.php而言的,不是相对于Utils而言的,这是因为我们通过init.php里的自动加载函数spl_autoload_register来require类的
代码如下 |
|
require_once '/Utils/Utils.php'; final class Init { /** * System config. */ public function init() { // error reporting - all errors for development (ensure you have // display_errors = On in your php.ini file) error_reporting ( E_ALL | E_STRICT ); mb_internal_encoding ( 'UTF-8' ); //registe classes spl_autoload_register ( array ($this,'loadClass' ) ); } /** * Class loader. */ public function loadClass($name) { $classes = Utils::getClasses (); if (! array_key_exists ( $name, $classes )) { die ( 'Class "' . $name . '" not found.' ); } require_once $classes [$name]; } } $init = new Init (); $init->init (); ?>
|
3、本例中在使用处test.php里require init.php
代码如下 |
|
require_once 'Init.php'; $dao = new UserDao(); $result = $dao->findByName('zcl'); ?> |
本文地址:
转载随意,但请附上文章地址:-)