深入理解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 相关文章推荐
第4章 数据处理-php数组的处理-郑阿奇
Jul 04 PHP
php在文件指定行中写入代码的方法
May 23 PHP
PHP中如何定义和使用常量
Feb 28 PHP
浅析Apache中RewriteCond规则参数的详细介绍
Jun 30 PHP
在PHP上显示JFreechart画的统计图方法
Nov 03 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
May 06 PHP
php验证session无效的解决方法
Nov 04 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
PHP绕过open_basedir限制操作文件的方法
Jun 10 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
Nov 04 PHP
thinkphp5框架路由原理与用法详解
Feb 11 PHP
PHP代码覆盖率统计详解
Jul 22 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分页时出现的Fatal error的解决方法
2011/04/18 PHP
PHP执行批量mysql语句的解决方法
2013/05/02 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
yii2使用gridView实现下拉列表筛选数据
2017/04/10 PHP
常用的javascript function代码
2008/05/23 Javascript
JavaScript 事件的一些重要说明
2009/10/25 Javascript
jQuery 幻灯片插件(带缩略图功能)
2011/01/24 Javascript
jquery常用操作小结
2014/07/21 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
原生js和jQuery实现淡入淡出轮播效果
2015/12/25 Javascript
jQuery CSS3相结合实现时钟插件
2016/01/08 Javascript
jQuery获取浏览器类型和版本号的方法
2016/07/05 Javascript
原生JS实现自定义滚动条效果
2020/10/27 Javascript
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
node.js遍历目录的方法示例
2018/08/01 Javascript
使用JavaScript解析URL的方法示例
2019/03/01 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
Python中生成器和迭代器的区别详解
2018/02/10 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
Python何时应该使用Lambda函数
2019/07/02 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
python爬虫 requests-html的使用
2020/11/30 Python
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
团日活动总结怎么写
2014/06/25 职场文书
对外汉语专业大学生职业生涯规划范文
2014/09/13 职场文书
四风问题对照检查材料整改措施
2014/09/27 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
《七月的天山》教学反思
2016/02/19 职场文书
使用GO语言实现Mysql数据库CURD的简单示例
2021/08/07 Golang
pytorch中的 .view()函数的用法介绍
2022/03/17 Python
oracle数据库去除重复数据
2022/05/20 Oracle
Redis基本数据类型哈希Hash常用操作命令
2022/06/01 Redis
超越Nginx的Web服务器caddy优雅用法
2022/06/21 Servers