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获取mysql版本的几种方法小结
Mar 25 PHP
php XMLWriter类的简单示例代码(RSS输出)
Sep 30 PHP
php打造属于自己的MVC框架
Mar 07 PHP
PHP-Java-Bridge使用笔记
Sep 22 PHP
php站内搜索关键词变亮的实现方法
Dec 30 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
Dec 16 PHP
解析PHP之提取多维数组指定列的方法
Jan 03 PHP
PHP 年月日的三级联动实例代码
May 24 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
PHP实现的MD5结合RSA签名算法实例
Oct 07 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 PHP
基于PHP实现发微博动态代码实例
Dec 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+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
Laravel5.1自定义500错误页面示例
2016/10/09 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
农历与西历对照
2006/09/06 Javascript
JS 自定义带默认值的函数
2011/07/21 Javascript
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
Javascript闭包(Closure)详解
2015/05/05 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
2016/06/14 Javascript
JS代码实现根据时间变换页面背景效果
2016/06/16 Javascript
解决canvas画布使用fillRect()时高度出现双倍效果的问题
2017/08/03 Javascript
详解.vue文件中style标签的几个标识符
2018/07/17 Javascript
vue引用外部JS的两种种方法
2020/01/28 Javascript
JavaScript浅层克隆与深度克隆示例详解
2020/09/01 Javascript
在vue中给后台接口传的值为数组的格式代码
2020/11/12 Javascript
[00:37]食人魔魔法师轮盘吉兆顺应全新至宝将拥有额外款式
2019/12/19 DOTA
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
2019/08/13 Python
python数据化运营的重要意义
2019/11/25 Python
python 实现方阵的对角线遍历示例
2019/11/29 Python
Django 博客实现简单的全文搜索的示例代码
2020/02/17 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
解决keras加入lambda层时shape的问题
2020/06/11 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
python中如何设置代码自动提示
2020/07/15 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
英国儿童家具专卖店:GLTC
2016/09/24 全球购物
One.com挪威:北欧成长最快的网络托管公司
2016/11/19 全球购物
跑步、骑行和铁人三项的高性能眼镜和服装:ROKA
2018/07/06 全球购物
享受加州生活方式的时尚舒适:XCVI
2018/07/09 全球购物
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
结构和类有什么异同
2012/07/16 面试题
煤矿安全生产标语
2014/06/06 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
2016优秀青年志愿者事迹材料
2016/02/25 职场文书
Hive导入csv文件示例
2022/06/25 数据库