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执行速度全攻略(下)
Oct 09 PHP
PHP详细彻底学习Smarty
Mar 27 PHP
php 日期和时间的处理-郑阿奇(续)
Jul 04 PHP
探讨:如何编写PHP扩展
Jun 13 PHP
PHP 读取大文件的X行到Y行内容的实现代码
Jun 24 PHP
typecho插件编写教程(一):Hello World
May 28 PHP
php抓取网站图片并保存的实现方法
Oct 29 PHP
实现PHP框架系列文章(6)mysql数据库方法
Mar 04 PHP
基于thinkPHP实现的微信自定义分享功能示例
Sep 23 PHP
PHP关键特性之命名空间实例详解
May 06 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
Jul 03 PHP
TP5框架实现签到功能的方法分析
Apr 05 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
Apache设置虚拟WEB
2006/10/09 PHP
利用PHP动态生成VRML网页
2006/10/09 PHP
PHP学习笔记之二 php入门知识
2011/01/12 PHP
ThinkPHP验证码和分页实例教程
2014/08/22 PHP
php 删除cookie方法详解
2014/12/01 PHP
php中session与cookie的比较
2015/01/27 PHP
thinkPHP中验证码的简单实现方法
2016/12/05 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
JS解密入门之凭直觉解
2008/06/25 Javascript
JavaScript 检测浏览器和操作系统的脚本
2008/12/26 Javascript
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
js拖拽一些常见的思路方法整理
2014/03/19 Javascript
jquery实现select选中行、列合计示例
2014/04/25 Javascript
jQuery中after()方法用法实例
2014/12/25 Javascript
jQuery中实现prop()函数控制多选框(全选,反选)
2016/08/19 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
2017/01/08 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
2017/06/16 jQuery
jsonp跨域获取数据的基础教程
2018/07/01 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
python实现多线程的两种方式
2016/05/22 Python
Python3 使用cookiejar管理cookie的方法
2018/12/28 Python
Numpy之random函数使用学习
2019/01/29 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
windows下python安装pip方法详解
2020/02/10 Python
pycharm实现在子类中添加一个父类没有的属性
2020/03/12 Python
Jupyter打开图形界面并画出正弦函数图像实例
2020/04/24 Python
CSS3田字格列表的样式编写方法
2018/11/22 HTML / CSS
Mytheresa英国官网:拥有160多个奢侈品品牌
2016/10/09 全球购物
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
2014/07/11 面试题
转党组织关系介绍信
2014/01/08 职场文书
货车司机岗位职责
2014/03/18 职场文书
2015年党总支工作总结
2015/05/25 职场文书
无房证明样本
2015/06/17 职场文书
2016年领导干部廉政承诺书
2016/03/24 职场文书