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+APACHE实现用户论证的方法
Oct 09 PHP
解决phpmyadmin 乱码,支持gb2312和utf-8
Nov 20 PHP
php Notice: Undefined index 错误提示解决方法
Aug 29 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
Jun 20 PHP
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
Oct 14 PHP
smarty内置函数config_load用法实例
Jan 22 PHP
PHP使用mysqldump命令导出数据库
Apr 14 PHP
php操作redis缓存方法分享
Jun 03 PHP
PHP的关于变量和日期处理的一些面试题目整理
Aug 10 PHP
深入理解PHP内核(二)之SAPI探究
Nov 10 PHP
Yii框架的路由配置方法分析
Sep 09 PHP
Laravel自动生成UUID,从建表到使用详解
Oct 24 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小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
调试一段PHP程序时遇到的三个问题
2012/01/17 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
点击文章内容处弹出页面代码
2009/10/01 Javascript
jquery得到font-size属性值实现代码
2013/09/30 Javascript
推荐10 款 SVG 动画的 JavaScript 库
2015/03/24 Javascript
JS实现的页面自定义滚动条效果
2015/10/26 Javascript
jQuery结合CSS制作动态的下拉菜单
2015/10/27 Javascript
AngularJS入门教程之AngularJS表达式
2016/04/18 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
2016/08/11 Javascript
判断数组的最佳方法(推荐)
2016/10/11 Javascript
Vue2.0+ElementUI实现表格翻页的实例
2017/10/23 Javascript
vue select选择框数据变化监听方法
2018/08/24 Javascript
JavaScript模板引擎应用场景及实现原理详解
2018/12/14 Javascript
浅谈JavaScript面向对象--继承
2019/03/20 Javascript
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
[15:09]DOTA2国际邀请赛采访专栏:Loda
2013/08/06 DOTA
Python实现的石头剪子布代码分享
2014/08/22 Python
python同时给两个收件人发送邮件的方法
2015/04/30 Python
Python进阶篇之字典操作总结
2016/11/16 Python
python实现flappy bird小游戏
2018/12/24 Python
PyQt5 QListWidget选择多项并返回的实例
2019/06/17 Python
在python中利用pycharm自定义代码块教程(三步搞定)
2020/04/15 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
C/C++程序员常见面试题一
2012/12/08 面试题
六一儿童节活动总结
2014/08/27 职场文书
祖国在我心中演讲稿200字
2014/08/28 职场文书
领导班子作风建设剖析材料
2014/10/11 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
办公室卫生管理制度
2015/08/04 职场文书
python中os.path.join()函数实例用法
2021/05/26 Python
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis