深入理解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几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
Jun 06 PHP
PHP CURL获取cookies模拟登录的方法
Nov 04 PHP
php中ob_get_length缓冲与获取缓冲长度实例
Nov 20 PHP
phpcms手机内容页面添加上一篇和下一篇
Jun 05 PHP
PHP批量去除BOM头内容信息代码
Mar 11 PHP
php版微信公众号接口实现发红包的方法
Oct 14 PHP
php查找字符串中第一个非0的位置截取
Feb 27 PHP
PHP实现活动人选抽奖功能
Apr 19 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
May 05 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
PHP通过GD库实现验证码功能示例
Feb 23 PHP
php设计模式之观察者模式定义与用法经典示例
Sep 19 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
基于mysql的论坛(6)
2006/10/09 PHP
php 攻击方法之谈php+mysql注射语句构造
2009/10/30 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
实例讲解php将字符串输出到HTML
2019/01/27 PHP
[原创]静态页面也可以实现预览 列表不同的显示方式
2006/10/14 Javascript
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
单击某一段文字改写文本颜色
2014/06/06 Javascript
JS实现的验证身份证及获取地区功能示例
2017/01/16 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
在vscode中统一vue编码风格的方法
2018/02/22 Javascript
详解vue中组件参数
2018/07/09 Javascript
Vue+axios实现统一接口管理的方法
2018/07/23 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
2019/06/19 Javascript
node获取客户端ip功能简单示例
2019/08/24 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
2020/04/21 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
原生js实现九宫格拖拽换位
2021/01/26 Javascript
[23:21]Ti4 冒泡赛第二轮DK vs C9 2
2014/07/14 DOTA
[06:16]《DAC最前线》之地区预选赛全面回顾
2015/01/19 DOTA
python中的内置函数getattr()介绍及示例
2014/07/20 Python
基于scrapy的redis安装和配置方法
2018/06/13 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
Python 忽略warning的输出方法
2018/10/18 Python
python opencv实现图像边缘检测
2019/04/29 Python
django实现web接口 python3模拟Post请求方式
2019/11/19 Python
在python中修改.properties文件的操作
2020/04/08 Python
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
戴尔英国翻新电脑和电子产品:Dell UK Refurbished Computers
2019/07/30 全球购物
经典演讲稿范文
2013/12/30 职场文书
城管大队整治方案
2014/05/06 职场文书
群众路线个人对照检查材料2014
2014/09/26 职场文书
2014年学习部工作总结
2014/11/12 职场文书
二年级语文下册复习计划
2015/01/19 职场文书
同学聚会邀请函
2015/01/30 职场文书