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 相关文章推荐
简单的页面缓冲技术
Oct 09 PHP
PHP Zip压缩 在线对文件进行压缩的函数
May 26 PHP
PHP备份/还原MySQL数据库的代码
Jan 06 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
Oct 04 PHP
PHP 通过Socket收发十六进制数据的实现代码
Aug 16 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
Aug 20 PHP
php简单生成随机数的方法
Jul 30 PHP
PHP易混淆知识整理笔记
Sep 24 PHP
php利用smtp类实现电子邮件发送
Oct 30 PHP
windows7配置Nginx+php+mysql的详细教程
Sep 04 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
Jul 09 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
Sep 30 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也可以?成Shell Script
2006/10/09 PHP
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
swfupload 多文件上传实现代码
2008/08/27 PHP
PHP中isset()和unset()函数的用法小结
2014/03/11 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
PHP提高编程效率的20个要点
2015/09/23 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
Prototype 工具函数 学习
2009/07/23 Javascript
获取服务器传来的数据 用JS去空格的正则表达式
2012/03/26 Javascript
JQuery EasyUI的使用
2016/02/24 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
2016/08/30 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
JavaScript交换两个变量值的七种解决方案
2016/12/01 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
在 Node.js 中使用原生 ES 模块方法解析
2017/09/19 Javascript
vue登录注册及token验证实现代码
2017/12/14 Javascript
微信小程序block的使用教程
2018/04/01 Javascript
[25:45]2018DOTA2亚洲邀请赛4.5SOLO赛 Sylar vs Paparazi
2018/04/06 DOTA
[37:02]OG vs INfamous 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python 获得命令行参数的方法(推荐)
2018/01/24 Python
python实现电脑自动关机
2018/06/20 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
2018/07/13 Python
python实现简单的文字识别
2018/11/27 Python
详解Python的三种可变参数
2019/05/08 Python
Python selenium的基本使用方法分析
2019/12/21 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
2020/06/10 Python
IE滤镜与CSS3效果(详细整理分享)
2013/01/25 HTML / CSS
有趣的流行文化T恤、马克杯、手机壳和更多:Look Human
2019/01/07 全球购物
音乐教学反思
2014/02/02 职场文书
职称评定自我鉴定
2014/03/18 职场文书
协议书样本
2014/04/23 职场文书
2015年小学财务工作总结
2015/07/20 职场文书
2016应届毕业生自荐信范文
2016/01/28 职场文书
如何让vue长列表快速加载
2021/03/29 Vue.js
OpenCV实现普通阈值
2021/11/17 Java/Android