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 miniBB中文乱码问题解决方法
Nov 25 PHP
PHP 进程锁定问题分析研究
Nov 24 PHP
php生成随机密码的几种方法
Jan 17 PHP
php学习之运算符相关概念
Jun 09 PHP
php正则表达式使用的详细介绍
Apr 27 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
Jun 28 PHP
图文介绍PHP添加Redis模块及连接
Jul 28 PHP
全面了解PHP中的全局变量
Jun 17 PHP
PHP获取客户端及服务器端IP的封装类
Jul 21 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
Nov 25 PHP
PHP通过curl获取接口URL的数据方法
May 31 PHP
php把文件设置为插件的技巧方法
Feb 03 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
Android AsyncTack 异步任务实例详解
2016/11/02 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
2017/07/03 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
php+croppic.js实现剪切上传图片功能
2018/08/14 PHP
laravel-admin 中列表筛选方法
2019/10/03 PHP
js字符编码函数区别分析
2008/06/05 Javascript
火狐4、谷歌12不支持Jquery Validator的解决方法分享
2011/06/20 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
2012/02/03 Javascript
使用js操作css实现js改变背景图片示例
2014/03/10 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
JavaScript的Polymer框架中dom-repeat与VM的相关操作
2015/07/29 Javascript
jquery表单验证需要做些什么
2015/11/17 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
浅析JSONP技术原理及实现
2016/06/08 Javascript
bootstrap轮播模板使用方法详解
2017/11/17 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
动态加载JavaScript文件的3种方式
2018/05/05 Javascript
vee-validate vue 2.0自定义表单验证的实例
2018/08/28 Javascript
jQuery轻量级表单模型验证插件
2018/10/15 jQuery
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
使用preload预加载页面资源时注意事项
2020/02/03 Javascript
vue 将多个过滤器封装到一个文件中的代码详解
2020/09/05 Javascript
Python字符串格式化
2015/06/15 Python
基于Django的ModelForm组件(详解)
2017/12/07 Python
django静态文件加载的方法
2018/05/20 Python
python找出完数的方法
2018/11/12 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
C语言基础笔试题
2013/04/27 面试题
八一演出活动方案
2014/02/03 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
2014年作风建设工作总结
2014/10/29 职场文书
2014年终个人工作总结
2014/11/07 职场文书
先进工作者推荐材料
2014/12/23 职场文书