深入理解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 相关文章推荐
DOM XPATH获取img src值的query
Sep 23 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
Jun 12 PHP
Windows下PHP开发环境搭建教程(Apache+PHP+MySQL)
Jun 13 PHP
ThinkPHP和UCenter接口冲突的解决方法
Jul 25 PHP
PHP自定义错误用法示例
Sep 28 PHP
Laravel实现自定义错误输出内容的方法
Oct 10 PHP
php字符串操作常见问题小结
Oct 11 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
Mar 28 PHP
php文件上传及下载附带显示文件及目录功能
Apr 27 PHP
Laravel学习教程之IOC容器的介绍与用例
Aug 15 PHP
laravel 中如何使用ajax和vue总结
Aug 16 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
Oct 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
PHP实现自动对图片进行滚动显示的方法
2015/03/12 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
WordPress中创建用户角色的相关PHP函数使用详解
2015/12/25 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
2007/05/03 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
jQuery中index()的用法分析
2014/09/05 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
JavaScript 面向对象与原型
2015/04/10 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
jQuery Ajax页面局部加载方法汇总
2016/06/02 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
nodejs中解决异步嵌套循环和循环嵌套异步的问题
2017/07/12 NodeJs
JavaScript中in和hasOwnProperty区别详解
2017/08/04 Javascript
JavaScript中Object值合并方法详解
2017/12/22 Javascript
Nuxt.js踩坑总结分享
2018/01/18 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
2019/10/25 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
微信小程序实现购物车功能
2020/11/18 Javascript
Python 元类实例解析
2018/04/04 Python
python对excel文档去重及求和的实例
2018/04/18 Python
jupyter修改文件名方式(TensorFlow)
2020/04/21 Python
Python数据可视化图实现过程详解
2020/06/12 Python
以工厂直接定价的传奇性能:Ben Hogan Golf
2019/01/04 全球购物
业务代表的岗位职责
2013/11/16 职场文书
大学军训感言1500字
2014/03/09 职场文书
学生手册评语
2014/05/05 职场文书
物业消防安全责任书
2014/07/23 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
2015年安全生产责任书
2015/01/30 职场文书
学校食堂管理制度
2015/08/04 职场文书
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python