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 str_pad 函数使用详解
Jan 13 PHP
vs中通过剪切板循环来循环粘贴不同内容
Apr 30 PHP
10条PHP高级技巧[修正版]
Aug 02 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
Nov 07 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
Jan 10 PHP
php中一个有意思的日期逻辑处理
Mar 25 PHP
修改apache配置文件去除thinkphp url中的index.php
Jan 17 PHP
PHP文件大小格式化函数合集
Mar 10 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
Dec 17 PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
May 12 PHP
对比分析php中Cookie与Session的异同
Feb 19 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
Oct 18 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通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
关于PHP递归算法和应用方法介绍
2013/04/15 PHP
php中curl和file_get_content的区别
2014/05/10 PHP
php socket实现的聊天室代码分享
2014/08/16 PHP
详解PHP归并排序的实现
2016/10/18 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
js replace正则表达式应用案例讲解
2013/01/17 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
jquery实现图片放大点击切换
2017/06/06 jQuery
js canvas实现适用于移动端的百分比仪表盘dashboard
2017/07/18 Javascript
vue iview多张图片大图预览、缩放翻转
2019/07/13 Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
2020/07/01 Javascript
vue 弹出遮罩层样式实例
2020/07/22 Javascript
Django中传递参数到URLconf的视图函数中的方法
2015/07/18 Python
python将ansible配置转为json格式实例代码
2017/05/15 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
在Mac上删除自己安装的Python方法
2018/10/29 Python
pandas去重复行并分类汇总的实现方法
2019/01/29 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
2019/11/15 Python
flask框架配置mysql数据库操作详解
2019/11/29 Python
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
俄罗斯建筑和装饰材料在线商店:Stroilandia
2020/07/25 全球购物
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
2014/07/11 面试题
软件测试笔试题
2012/10/25 面试题
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
模具专业毕业推荐信
2014/03/08 职场文书
六年级学生评语
2014/04/22 职场文书
3分钟英语演讲稿
2014/04/29 职场文书
2014年售后服务工作总结
2014/11/18 职场文书
2015年纪检监察工作总结
2015/04/08 职场文书
2016开学第一课心得体会
2016/01/23 职场文书
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫
Python Matplotlib绘制动画的代码详解
2022/05/30 Python