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 相关文章推荐
删除无限级目录与文件代码共享
Jul 12 PHP
PHP下对数组进行排序的函数
Aug 08 PHP
php生成EAN_13标准条形码实例
Nov 13 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
Mar 17 PHP
smarty半小时快速上手入门教程
Oct 27 PHP
php使用PDO操作MySQL数据库实例
Dec 30 PHP
php常用表单验证类用法实例
Jun 18 PHP
php实现分页显示
Nov 03 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
Nov 22 PHP
PHP小程序支付功能完整版【基于thinkPHP】
Mar 26 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
Jun 25 PHP
PHP+MySQL实现在线测试答题实例
Jan 02 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中使用break跳出多重循环代码实例
2015/01/21 PHP
PHP上传文件参考配置大文件上传
2015/12/16 PHP
thinkPHP自定义类实现方法详解
2016/11/30 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
JS对象转换为Jquery对象实现代码
2013/12/29 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
JavaScript html5 canvas绘制时钟效果
2016/03/01 Javascript
Bootstrap基本插件学习笔记之按钮(21)
2016/12/08 Javascript
学习 NodeJS 第八天:Socket 通讯实例
2016/12/21 NodeJs
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
vue+element实现批量删除功能的示例
2018/02/28 Javascript
vue-cli 3 全局过滤器的实例代码详解
2019/06/03 Javascript
python读取json文件并将数据插入到mongodb的方法
2015/03/23 Python
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
2016/06/29 Python
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
Python多进程入门、分布式进程数据共享实例详解
2019/06/03 Python
详解Python3 pandas.merge用法
2019/09/05 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
Python批量启动多线程代码实例
2020/02/18 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
CSS3中动画属性transform、transition和animation属性的区别
2016/09/25 HTML / CSS
Casadei卡萨蒂官网:意大利奢侈鞋履品牌
2017/10/28 全球购物
枚举和一组预处理的#define有什么不同
2016/09/21 面试题
蔬菜基地的创业计划书
2014/01/06 职场文书
电大会计学自我鉴定
2014/02/06 职场文书
公司投资建议书
2014/05/16 职场文书
酒店爱岗敬业演讲稿
2014/09/02 职场文书
2015年秋季运动会前导词
2015/07/20 职场文书
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL
Pytorch实现图像识别之数字识别(附详细注释)
2021/05/11 Python
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang
redis的list数据类型相关命令介绍及使用
2022/01/18 Redis