安徽25选5官网:PHP的autoload自动加载机制使用说明

作者:网络 来源:佚名 更新时间:2010-12-28 17:29:03 点击:

安徽25选5直播 www.by7yj.cn 自PHP5后,引入了__autoload这个拦截器方法,可以自动对class文件进行包含引用,下面看具体的使用方法。
在PHP开发过程中,如果希望从外部引入一个class,通?;崾褂胕nclude和require方法,去把定义这个class的文件包含进来,但是这样可能会使得在引用文件的新脚本中,存在大量的include或require方法调用,如果一时疏忽遗漏则会产生错误,使得代码难以维护。

自PHP5后,引入了__autoload这个拦截器方法,可以自动对class文件进行包含引用,通常我们会这么写:
 

function __autoload($className) { 
include_once $className . '.class.php'; 
} 

$user = new User(); 

当PHP引擎试图实例化一个未知类的操作时,会调用__autoload()方法,在PHP出错失败前有了最后一个机会加载所需的类。因此,上面的这段代码执行时,PHP引擎实际上替我们自动执行了一次__autoload方法,将User.class.php这个文件包含进来。

在__autoload函数中抛出的异常不能被catch语句块捕获并导致致命错误。

如果使用 PHP的CLI交互模式时,自动加载机制将不会执行。

当你希望使用PEAR风格的命名规则,例如需要引入User/Register.php文件,也可以这么实现:
 

//加载我 
function __autoload($className) { 
$file = str_replace('_', DIRECTORY_SEPARATOR, $className); 
include_once $file . 'php'; 
} 
$userRegister = new User_Register(); 

这种方法虽然方便,但是在一个大型应用中如果引入多个类库的时候,可能会因为不同类库的autoload机制而产生一些莫名其妙的问题。在PHP5引入SPL标准库后,我们又多了一种新的解决方案,spl_autoload_register()函数。

此函数的功能就是把函数注册至SPL的__autoload函数栈中,并移除系统默认的__autoload()函数。一旦调用spl_autoload_register()函数,当调用未定义类时,系统会按顺序调用注册到spl_autoload_register()函数的所有函数,而不是自动调用__autoload()函数,下例调用的是User/Register.php而不是User_Register.class.php:
 

//不加载我 
function __autoload($className) { 
include_once $className . '.class.php'; 
} 
//加载我 
function autoload($className) { 
$file = str_replace('/', DIRECTORY_SEPARATOR, $className); 
include_once $file . '.php'; 
} 
//开始加载 
spl_autoload_register('autoload'); 
$userRegister = new User_Register(); 

在使用spl_autoload_register()的时候,我们还可以考虑采用一种更安全的初始化调用方法,参考如下:
 

//系统默认__autoload函数 
function __autoload($className) { 
include_once $className . '.class.php'; 
} 
//可供SPL加载的__autoload函数 
function autoload($className) { 
$file = str_replace('_', DIRECTORY_SEPARATOR, $className); 
include_once $file . '.php'; 
} 
//不小心加载错了函数名,同时又把默认__autoload机制给取消了……囧 
spl_autoload_register('_autoload', false); 
//容错机制 
if(false === spl_autoload_functions()) { 
if(function_exists('__autoload')) { 
spl_autoload_register('__autoload', false); 
} 
} 

技巧:在Unix/Linux环境下,如果你有多个规模较小的类,为了管理方便,都写在一个php文件中的时候,可以通过以ln -s命令做软链接的方式快速分发成多个不同类名的拷贝,再通过autoload机制进行加载。

  • 当蔚来照进现实 场地初试蔚来ES8 2019-06-25
  • 清明五一假期将至 韩国酒店为迎中国游客各出奇招 2019-06-24
  • 社会主义社会按劳分配是建立在公有制和私有制并存基础上的,共产主义社会按需分配是建立在公有制基础上的,所有制基础不同,其分配形式也就不同。所谓“共产主义... 2019-06-24
  • 编造传播虚假信息 “曹山石”被证监会处罚20万元 2019-06-23
  • 【新时代 新作为 新篇章】创新突破封锁线 2019-06-23
  • 90岁老夫妇也玩王者荣耀真人cosplay? 2019-06-23
  • 新疆举办高考招生咨询会 2019-06-23
  • 在强国论坛和新浪微博上也就说了几句国产80后伟大的钢琴家,嚯!粉丝不干了,邮箱里塞满男性女性生殖器的骂声和愤慨声。其实,真没有诋毁的意思。比如,美国一家男性内衣 2019-06-22
  • 共产党新闻网—资料中心—中国共产党重要会议 2019-06-22
  • “个十百千万”打造5G之城 “五横七纵”共筑产业联盟 2019-06-21
  • 倒着走能治腰颈椎痛?假的! 2019-06-21
  • 拥有大智慧的中国古人就把“子”和“女”结合在一体,造出一个会意字“好”字。一直就用这个“好”的感觉结果去衡量其它任何生存环境中的万物万事所给人的感觉。 2019-06-20
  • “ONE NIGHT 给小孩”北京站探访 周迅刘雯共奏可爱“交响曲” 2019-06-20
  • 人民网舆情分析专家:陈丽 2019-06-20
  • 图画书《一只特立独行的猪》用布艺风格讲故事 2019-06-19
  • 任选9场胜负复式怎么算 wnba比分直播网 宁夏十一选五手机版 大乐彩广东11选5 百家乐破解方法 凯旋国际娱乐网 福彩3d和值走势图2000 河南快3开奖和值河南 毕业分布图3d 德甲直播 30选5今天开奖结果 单双中特中后付 牛牛彩票网骗局 新疆11选5专家杀号 北京pk107码倍投表