深入理解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实现将GB编码转换为UTF8
Nov 25 PHP
php安全配置 如何配置使其更安全
Dec 16 PHP
php 模拟POST提交的2种方法详解
Jun 17 PHP
php静态文件返回304技巧分享
Jan 06 PHP
php上传中文文件名乱码问题处理方案
Feb 03 PHP
PHP读取汉字的点阵数据
Jun 22 PHP
学习php设计模式 php实现合成模式(composite)
Dec 08 PHP
Yii2 输出xml格式数据的方法
May 03 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
PHP多进程之pcntl_fork的实例详解
Oct 15 PHP
PHP基于面向对象实现的留言本功能实例
Apr 04 PHP
Laravel路由研究之domain解决多域名问题的方法示例
Apr 04 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
header()函数使用说明
2006/11/23 PHP
php自定义函数之递归删除文件及目录
2010/08/08 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
2014/06/13 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
2014/07/18 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
基于thinkPHP类的插入数据库操作功能示例
2017/01/06 PHP
PHP序列化和反序列化深度剖析实例讲解
2020/12/29 PHP
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
jQuery简单实现tab选项卡切换效果
2016/06/20 Javascript
省市选择的简单实现(基于zepto.js)
2016/06/21 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
2016/09/24 Javascript
Javascript 实现全屏滚动实例代码
2016/12/31 Javascript
基于Angularjs+mybatis实现二级评论系统(仿简书)
2017/02/13 Javascript
Vue计算属性的使用
2017/08/04 Javascript
VueCli3构建TS项目的方法步骤
2018/11/07 Javascript
Node.js爬虫如何获取天气和每日问候详解
2019/08/26 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
vue全局使用axios的操作
2020/09/08 Javascript
原生js实现下拉框选择组件
2021/01/20 Javascript
讲解Python中运算符使用时的优先级
2015/05/14 Python
python使用in操作符时元组和数组的区别分析
2015/05/19 Python
python生成验证码图片代码分享
2016/01/28 Python
python 以16进制打印输出的方法
2018/07/09 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
Python模拟FTP文件服务器的操作方法
2020/02/18 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
2020/04/20 Python
Black Halo官方网站:购买连衣裙、礼服和连体裤
2018/06/13 全球购物
比较基础的php面试题及答案-填空题
2014/04/26 面试题
高中社区服务活动报告
2015/02/05 职场文书
2015年人事科工作总结
2015/04/28 职场文书
2019毕业典礼主持词!
2019/07/05 职场文书
Redis可视化客户端小结
2021/06/10 Redis
python基础之错误和异常处理
2021/10/24 Python
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
2022/03/03 Python