深入理解PHP类的自动载入机制


Posted in PHP onSeptember 16, 2016

php的自动加载:

在php5以前,我们要用某个类或类的方法,那必须include或者require,之后才能使用,每次用一个类,都需要写一条include,麻烦

php作者想简单点,最好能引用一个类时,如果当前没有include进来,系统能自动去找到该类,自动引进~

于是:__autoload()函数应运而生。

通常放在应用程序入口类里面,比如discuz中,放在class_core.php中。

先讲浅显的例子:

第一种情况:文件A.php中内容如下

<?php

class A{

public function __construct(){

    echo 'fff';

}

}

?>

文件C.php 中内容如下:

<?php  
function __autoload($class)  
{  
$file = $class . '.php';  
if (is_file($file)) {  
require_once($file);  
}  
}  
$a = new A(); //这边会自动调用__autoload,引入A.php文件

?>

第二种情况:有时我希望能自定义autoload,并且希望起一个更酷的名字loader,则C.php改为如下:

<?php
function loader($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}

spl_autoload_register('loader'); //注册一个自动加载方法,覆盖原有的__autoload

$a = new A();

?>

第三种情况:我希望高大上一点,用一个类来管理自动加载

<?php  
class Loader  
{  
public static function loadClass($class)  
{  
$file = $class . '.php';  
if (is_file($file)) {  
require_once($file);  
}  
}  
}  

spl_autoload_register(array('Loader', 'loadClass'));  

$a = new A();

?>

当前为最佳形式。

通常我们将spl_autoload_register(*)放在入口脚本,即一开始就引用进来。比如下面discuz的做法。

if(function_exist('spl_autoload_register')){

spl_autoload_register(array('core','autoload')); //如果是php5以上,存在注册函数,则注册自己写的core类中的autoload为自动加载函数

}else{

function __autoload($class){     //如果不是,则重写php原生函数__autoload函数,让其调用自己的core中函数。

return core::autoload($class);

}

}

这段扔在入口文件最前面,自然是极好的~

以上这篇深入理解PHP类的自动载入机制就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP的一个完整SMTP类(解决邮件服务器需要验证时的问题)
Oct 09 PHP
一个简单的MySQL数据浏览器
Oct 09 PHP
用PHP的ob_start();控制您的浏览器cache!
Feb 14 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
Aug 24 PHP
php制作unicode解码工具(unicode编码转换器)代码分享
Dec 24 PHP
PHP 动态生成静态HTML页面示例代码
Jan 15 PHP
php版小黄鸡simsimi聊天机器人接口分享
Jan 26 PHP
php计算两个日期时间差(返回年、月、日)
Jun 19 PHP
护卫神php套件 php版本升级方法(php5.5.24)
May 10 PHP
详解Yii2 之 生成 URL 的方法
Jun 16 PHP
php实现的生成排列算法示例
Jul 25 PHP
PHP设计模式概论【概念、分类、原则等】
May 01 PHP
PHP实现链式操作的原理详解
Sep 16 #PHP
详解PHP中websocket的使用方法
Sep 15 #PHP
PHP简单实现上一页下一页功能示例
Sep 14 #PHP
PHP自定义函数格式化json数据示例
Sep 14 #PHP
ThinkPHP中session函数详解
Sep 14 #PHP
PHP大神的十大优良习惯
Sep 14 #PHP
thinkPHP的表达式查询用法详解
Sep 14 #PHP
You might like
Windows PHP5和Apache的安装与配置
2009/06/08 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
PHP代码审核的详细介绍
2013/06/13 PHP
深入Nginx + PHP 缓存详解
2013/07/11 PHP
PHP单例模式详细介绍
2015/07/01 PHP
PHP后台备份MySQL数据库的源码实例
2019/03/18 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
jQuery 表单验证扩展代码(一)
2010/10/11 Javascript
jquery $.fn $.fx是什么意思有什么用
2013/11/04 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
node.js文件上传重命名以及移动位置的示例代码
2018/01/19 Javascript
vue 的keep-alive缓存功能的实现
2018/03/22 Javascript
jQuery 同时获取多个标签的指定内容并储存为数组
2018/11/20 jQuery
echarts实现折线图的拖拽效果
2019/12/19 Javascript
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
2013/11/27 Python
python安装oracle扩展及数据库连接方法
2017/02/21 Python
Python爬虫之网页图片抓取的方法
2018/07/16 Python
浅谈Python的list中的选取范围
2018/11/12 Python
python实现坦克大战游戏 附详细注释
2020/03/27 Python
pytorch 状态字典:state_dict使用详解
2020/01/17 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
Python抖音快手代码舞(字符舞)的实现方法
2021/02/07 Python
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
垃圾回收的优点和原理
2014/05/16 面试题
计算机网络专业个人的自我评价
2013/10/17 职场文书
工作会议欢迎词
2014/01/16 职场文书
爱国卫生月实施方案
2014/02/21 职场文书
2014年团支部工作总结
2014/11/17 职场文书
2019年亲子运动会口号
2019/10/11 职场文书