深入理解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的中问验证码
Nov 25 PHP
php中CI操作多个数据库的代码
Jul 05 PHP
简单实用的.net DataTable导出Execl
Oct 28 PHP
PHP实现HTML生成PDF文件的方法
Nov 07 PHP
PHP实现过滤各种HTML标签
May 17 PHP
提高php编程效率技巧
Aug 13 PHP
PHP实现163邮箱自动发送邮件
Mar 29 PHP
浅谈ThinkPHP中initialize和construct的区别
Apr 01 PHP
PHP经典实用正则表达式小结
May 04 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
Aug 15 PHP
php生成毫秒时间戳的实例讲解
Sep 22 PHP
tp5 实现列表数据根据状态排序
Oct 18 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 中的输出缓冲
2006/12/21 PHP
PHP 缓存实现代码及详细注释
2010/05/16 PHP
深入解析php中的foreach问题
2013/06/30 PHP
Yii2框架数据库简单的增删改查语法小结
2016/08/31 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
Javascript操纵Cookie实现购物车程序
2007/02/15 Javascript
妙用Jquery的val()方法
2012/06/27 Javascript
jQuery中on()方法用法实例详解
2015/02/06 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
详解JavaScript逻辑And运算符
2015/12/04 Javascript
JavaScript 过滤关键字
2017/03/20 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
微信小程序使用wxParse解析html的实现示例
2018/08/30 Javascript
微信小程序实现九宫格抽奖
2020/04/15 Javascript
jQuery实现html可联动的百分比进度条
2020/03/26 jQuery
微信小程序中data-key属性之数据传输(经验总结)
2020/08/22 Javascript
[38:21]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS Newbee
2018/03/31 DOTA
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
python使用Berkeley DB数据库实例
2014/09/26 Python
Python制作简易注册登录系统
2016/12/15 Python
Python实现的端口扫描功能示例
2018/04/08 Python
Python文本处理之按行处理大文件的方法
2018/04/09 Python
对python字典元素的添加与修改方法详解
2018/07/06 Python
Python多线程同步---文件读写控制方法
2019/02/12 Python
200行python代码实现2048游戏
2019/07/17 Python
你需要学会的8个Python列表技巧
2020/06/24 Python
浅析HTML5 meta viewport参数
2020/10/28 HTML / CSS
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
美国围栏公司:Walpole Outdoors
2019/11/19 全球购物
会话Bean的种类
2013/11/07 面试题
保荐人的岗位职责
2013/11/19 职场文书
房屋改造计划书
2014/01/10 职场文书
青年教师培训方案
2014/02/06 职场文书
团日活动总结模板
2014/06/25 职场文书
2014年党员教师自我剖析材料
2014/09/30 职场文书