深入理解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 相关文章推荐
JAVA/JSP学习系列之七
Oct 09 PHP
php注入实例
Oct 09 PHP
如何把PHP转成EXE文件
Oct 09 PHP
使ecshop模板中可引用常量的实现方法
Jun 02 PHP
图解找出PHP配置文件php.ini的路径的方法
Aug 20 PHP
dedecms集成财付通支付接口
Dec 28 PHP
php使用unset()删除数组中某个单元(键)的方法
Feb 17 PHP
PHP邮件群发机实现代码
Feb 16 PHP
php简单中奖算法(实例)
Aug 15 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
Oct 17 PHP
详解Laravel设置多态关系模型别名的方式
Oct 17 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
php array_filter除去数组中的空字符元素
2020/06/21 PHP
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
2012/06/05 PHP
php实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
windows下配置php5.5开发环境及开发扩展
2014/12/25 PHP
CI框架中site_url()和base_url()的区别
2015/01/07 PHP
php+mysql查询优化简单实例
2015/01/13 PHP
详解laravel安装使用Passport(Api认证)
2018/07/27 PHP
解决 firefox 不支持 document.all的方法
2007/03/12 Javascript
javascript通过className来获取元素的简单示例代码
2014/01/10 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
js操作iframe父子窗体示例
2014/05/22 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
2015/02/25 Javascript
jQuery中prepend()方法使用详解
2015/08/11 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
2016/05/31 Javascript
详解打造 Vue.js 可复用组件
2017/03/24 Javascript
详解Angular中的自定义服务Service、Provider以及Factory
2017/04/22 Javascript
详解JS中统计函数执行次数与执行时间
2018/09/04 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
前端 javascript 实现文件下载的示例
2020/11/24 Javascript
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
10款最好的Web开发的 Python 框架
2015/03/18 Python
Python编程实现使用线性回归预测数据
2017/12/07 Python
django 将model转换为字典的方法示例
2018/10/16 Python
Python算法中的时间复杂度问题
2019/11/19 Python
基于python检查矩阵计算结果
2020/05/21 Python
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
捷科时代的软件测试笔试题
2015/11/09 面试题
教师绩效工资方案
2014/02/01 职场文书
法定代表人授权委托书范文
2014/09/22 职场文书
初中开学典礼新闻稿
2015/07/17 职场文书
三八节祝酒词
2015/08/11 职场文书
承诺书怎么写 ?
2019/04/16 职场文书
python 经纬度求两点距离、三点面积操作
2021/06/03 Python