深入理解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与javascript对多项选择的处理
Oct 09 PHP
PHP 魔术函数使用说明
May 14 PHP
PHP编程最快明白(第一讲 软件环境和准备工作)
Oct 25 PHP
PHP JSON格式数据交互实例代码详解
Jan 13 PHP
PHP文件读写操作之文件写入代码
Jan 13 PHP
PHP基础学习之流程控制的实现分析
Apr 28 PHP
Yii入门教程之目录结构、入口文件及路由设置
Nov 25 PHP
php显示时间常用方法小结
Jun 05 PHP
WordPress中&quot;无法将上传的文件移动至&quot;错误的解决方法
Jul 01 PHP
php实现三级级联下拉框
Apr 17 PHP
php实现XML和数组的相互转化功能示例
Feb 08 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 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
PHP5中使用PDO连接数据库的方法
2010/08/01 PHP
用PHP编写和读取XML的几种方式
2013/01/12 PHP
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
PHP递归创建多级目录
2015/11/05 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
Laravel下生成验证码的类
2017/11/15 PHP
PHP中命名空间的使用例子
2019/03/22 PHP
总结AJAX相关JS代码片段和浏览器模型
2007/08/15 Javascript
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
JQuery UI的拖拽功能实现方法小结
2012/03/14 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
浅析JS原型继承与类的继承
2016/04/07 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
Javascript中click与blur事件的顺序详析
2017/04/25 Javascript
javascript+html5+css3自定义弹出窗口效果
2017/10/26 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
2019/08/13 Javascript
jquery传参及获取方式(两种方式)
2020/02/13 jQuery
vue实现带过渡效果的下拉菜单功能
2020/02/19 Javascript
前端vue+elementUI如何实现记住密码功能
2020/09/20 Javascript
[37:45]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS Orenda
2014/05/22 DOTA
Python进行数据科学工作的简单入门教程
2015/04/01 Python
PyCharm设置每行最大长度限制的方法
2019/01/16 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
HTML5 通过Vedio标签实现视频循环播放的示例代码
2020/08/05 HTML / CSS
HTML5适合的情人节礼物有纪念日期功能
2021/01/25 HTML / CSS
C#笔试题集合
2013/06/21 面试题
餐饮部总监岗位职责范文
2014/02/13 职场文书
构建高效课堂实施方案
2014/03/13 职场文书
诚信贷款承诺书
2014/05/30 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
《走遍天下书为侣》教学反思
2016/02/22 职场文书