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 随机生成10位字符代码
Mar 26 PHP
PHP中将网页导出为Word文档的代码
May 25 PHP
深入PHP5中的魔术方法详解
Jun 17 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
Oct 25 PHP
php对二维数组按指定键值key排序示例代码
Nov 26 PHP
ThinkPHP中的关联模型注意点
Jun 16 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
May 20 PHP
PHP获取用户客户端真实IP的解决方案
Oct 10 PHP
PHP实现的登录,注册及密码修改功能分析
Nov 25 PHP
PHP实现大数(浮点数)取余的方法
Feb 18 PHP
php中上传文件的的解决方案
Sep 25 PHP
PHP与SQL语句写一句话木马总结
Oct 11 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 购物车的例子
2009/05/04 PHP
又拍云异步上传实例教程详解
2016/04/19 PHP
js 实现无缝滚动 兼容IE和FF
2009/07/15 Javascript
页面版文本框智能提示JS代码
2009/11/20 Javascript
JavaScript创建一个欢迎cookie弹出窗实现代码
2013/03/15 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
jQuery原生的动画效果
2015/07/10 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
2015/09/01 Javascript
JQuery自适应窗口大小导航菜单附源码下载
2015/09/01 Javascript
jQuery layui常用方法介绍
2016/07/25 Javascript
vue日期组件 支持vue1.0和2.0
2017/01/09 Javascript
jQuery validate 验证radio实例
2017/03/01 Javascript
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
Angularjs使用过滤器完成排序功能
2017/09/20 Javascript
详解如何给React-Router添加路由页面切换时的过渡动画
2019/04/25 Javascript
element实现合并单元格通用方法
2019/11/13 Javascript
js判断非127开头的IP地址的实例代码
2020/01/05 Javascript
JS原形与原型链深入详解
2020/05/09 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
python实现通过shelve修改对象实例
2014/09/26 Python
Python基于回溯法子集树模板解决选排问题示例
2017/09/07 Python
Python pymongo模块用法示例
2018/03/31 Python
python得到电脑的开机时间方法
2018/10/15 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
Django集成搜索引擎Elasticserach的方法示例
2019/06/04 Python
使用python获取(宜宾市地震信息)地震信息
2019/06/20 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
2021/02/22 Python
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
校园创业策划书
2014/01/14 职场文书
五年级小学生评语
2014/12/26 职场文书
2015年小学一年级班主任工作总结
2015/05/21 职场文书
旷工检讨书大全
2015/08/15 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS
python如何正确使用yield
2021/05/21 Python
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android
css filter和getUserMedia的联合使用
2022/02/24 HTML / CSS