PHP框架自动加载类文件原理详解


Posted in PHP onJune 06, 2017

描述:公司项目PHP用作中间转发层(接收http请求,用 socket跟c++做通信),由于代码没有用到框架,这些东西自然就是之前的人自己写的。最近需要对这个底层进行优化,于是便看了下这部分的代码。

目的:这块代码的主要作用是把主目录下的所有插件类一次性全部加载进来。当使用尚未被定义的类(class)和接口(interface)时自动去加载。通过注册自动加载器,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。

实现方法:主要用到PHP函数__autoload()

详细:

error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
set_include_path($_SERVER['Root_Path'] . '/libs' . PATH_SEPARATOR .
   $_SERVER['Root_Path'] . '/lib' . PATH_SEPARATOR .
   get_include_path() );
if (!function_exists('__autoload')) {
 function __autoload($className)
 {
 ///优化包含路径
 $path=_getRootPath($className);
 $revpath=strtr($className, '_', '/'). '.php';
 $rootpath=$path.$revpath;
 file_exists($rootpath)?include($rootpath):@include($revpath);
 }
}

/**
 *得到根路径*
 */
function _getRootPath($classname)
{
 $pearpath=$_SERVER["PHP_PEAR_PATH"].'/';
 $libpath=$_SERVER['Root_Path'] . '/lib/';
 $libspath=$_SERVER['Root_Path'] . '/libs/';

 if(strpos($classname,'Zend_')===0) return $pearpath; ///zend 框架路径
 if(strpos($classname,'DB_')===0 || strpos($classname,'Interface_')===0 || strpos($classname,'Others_')===0 || strpos($classname,'Pay_')===0 || strpos($classname,'PHPMailer_')===0 ) return $libspath;
 return $libpath;
}

其中_getRootPath($classname)函数获取的是类名文件所在的真实目录,根据类名的头字段判断类在哪个目录下;

如果类能在这些目录下找到,类在使用前就会被加载。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP的开合式多级菜单程序
Oct 09 PHP
在IIS7.0下面配置PHP 5.3.2运行环境的方法
Apr 13 PHP
php快速url重写 更新版[需php 5.30以上]
Apr 20 PHP
解析php二分法查找数组是否包含某一元素
May 23 PHP
对淘宝URL中ID提取的PHP代码
Sep 01 PHP
php中常见的sql攻击正则表达式汇总
Nov 06 PHP
PHP5.5迭代生成器用法实例详解
Mar 16 PHP
CodeIgniter基于Email类发邮件的方法
Mar 29 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
Nov 09 PHP
PHP7如何开启Opcode打造强悍性能详解
May 11 PHP
php微信开发之关键词回复功能
Jun 13 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
Dec 13 PHP
Yii输入正确验证码却验证失败的解决方法
Jun 06 #PHP
Yii 2.0在Grid中格式化时间方法示例
Jun 06 #PHP
解决php-fpm.service not found问题的办法
Jun 06 #PHP
PHP使用new StdClass()创建空对象的方法分析
Jun 06 #PHP
php 7新特性之类型申明详解
Jun 06 #PHP
thinkPHP+phpexcel实现excel报表输出功能示例
Jun 06 #PHP
PHP实现RSA签名生成订单功能【支付宝示例】
Jun 06 #PHP
You might like
用PHP制作静态网站的模板框架(三)
2006/10/09 PHP
PHP中iconv函数知识汇总
2015/07/02 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
2019/10/11 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
DWR Ext 加载数据
2009/03/22 Javascript
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
js中取得变量绝对值的方法
2015/01/03 Javascript
JavaScript中的闭包介绍
2015/03/15 Javascript
jQuery入门基础知识学习指南
2015/08/14 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
2016/01/25 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
2016/02/15 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
2019/02/25 Javascript
深入了解JavaScript 的 WebAssembly
2019/06/15 Javascript
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
python交互式图形编程实例(二)
2017/11/17 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
python如何实现一个刷网页小程序
2018/11/27 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
2019/09/23 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
Pycharm修改python路径过程图解
2020/05/22 Python
Python爬虫分析微博热搜关键词的实现代码
2021/02/22 Python
个人合伙协议书范本
2014/10/14 职场文书
2015年外联部工作总结
2015/04/03 职场文书
被告答辩状范文
2015/05/22 职场文书
小学数学国培研修日志
2015/11/13 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
2016年中秋节晚会领导致辞
2015/11/26 职场文书
Python实现列表拼接和去重的三种方式
2021/07/02 Python
MySQL聚簇索引和非聚簇索引的区别详情
2022/06/14 MySQL