在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和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机制进行加载。
自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机制进行加载。
标签:
autoload,自动加载
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
金钱帮资源网 Copyright www.kbjia.com
暂无“PHP的autoload自动加载机制使用说明”评论...
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
2024年10月24日
2024年10月24日
- 群星2013-青春缤纷辑压箱宝大公开3CD2[新加坡限量版][WAV整轨]
- 林育群.2013-BalladShow(日本版)【环球】【WAV+CUE】
- 陈加洛.1992-痛到感觉不到【宝丽金】【WAV+CUE】
- 群星.2023-宿命之敌电视剧原声带【韶愔音乐】【FLAC分轨】
- 東京事変-大発見[FLAC+CUE]
- 椎名林檎-三文ゴシップ[FLAC+CUE]
- 2024年08月04日
- 裘德《裘德「最后的水族馆」演唱会LIVE》[320K/MP3][228.89MB]
- 裘德《裘德「最后的水族馆」演唱会LIVE》[24bit 48kHz][FLAC/分轨][2.08G]
- 基因三重奏《如果你什么都不说 音乐会现场录音》[320K/MP3][145.37MB]
- 孟庭苇.1996-月亮说话(2020环球24KGOLD限量版)【上华】【WAV+CUE】
- 群星.1997-新艺宝优质音响系列·国语精选监听版【新艺宝】【WAV+CUE】
- 阿桑.2005-寂寞在唱歌(星外星引进版)【华研国际】【WAV+CUE】
- 基因三重奏《如果你什么都不说 音乐会现场录音》[FLAC/分轨][287.43MB]
- 蔡题谦《我爱你,却依然要看你走》[320K/MP3][88.65MB]