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文件下载类
Dec 06 PHP
一个数据采集类
Feb 14 PHP
PHP如何编写易读的代码
Jul 10 PHP
php 来访国内外IP判断代码并实现页面跳转
Dec 18 PHP
zf框架的registry(注册表)使用示例
Mar 13 PHP
Yii框架中memcache用法实例
Dec 03 PHP
php 流程控制switch的简单实例
Jun 07 PHP
简单的自定义php模板引擎
Aug 26 PHP
php封装的smartyBC类完整实例
Oct 19 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
Apr 27 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
Sep 22 PHP
PHP7 弃用功能
Mar 09 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
自己动手做一个SQL解释器
2006/10/09 PHP
php 变量未定义等错误的解决方法
2011/01/12 PHP
PHP可变变量学习小结
2015/11/29 PHP
PHP实现的DES加密解密实例代码
2016/04/06 PHP
Yii框架中jquery表单验证插件用法示例
2016/10/18 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
2014/12/20 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
2016/11/05 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
Vue的Class与Style绑定的方法
2017/09/01 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
改变vue请求过来的数据中的某一项值的方法(详解)
2018/03/08 Javascript
官方推荐react-navigation的具体使用详解
2018/05/08 Javascript
nodejs使用node-xlsx生成excel的方法示例
2019/08/22 NodeJs
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
Python实现脚本锁功能(同时只能执行一个脚本)
2017/05/10 Python
浅谈Python处理PDF的方法
2017/11/10 Python
python实现聊天小程序
2018/03/13 Python
pandas.DataFrame选取/排除特定行的方法
2018/07/03 Python
python爬虫之自动登录与验证码识别
2020/06/15 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
2019/09/26 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
自我鉴定的范文
2013/10/03 职场文书
后勤主管工作职责
2013/12/07 职场文书
2015年国税春训心得体会
2015/03/09 职场文书
个人求职意向书
2015/05/11 职场文书
2015年员工试用期工作总结
2015/05/28 职场文书
4种非常实用的python内置数据结构
2021/04/28 Python
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis