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 CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
Jan 16 PHP
PHP字符串的连接的简单实例
Dec 30 PHP
PHP开发框架kohana3 自定义路由设置示例
Jul 14 PHP
PHP使用CURL_MULTI实现多线程采集的例子
Jul 29 PHP
Yii核心组件AssetManager原理分析
Dec 02 PHP
php使用类继承解决代码重复的问题
Feb 11 PHP
浅析PHP中Session可能会引起并发问题
Jul 23 PHP
利用PHP将部分内容用星号替换
Apr 21 PHP
Fleaphp常见函数功能与用法示例
Nov 15 PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 PHP
PHP 观察者模式深入理解与应用分析
Sep 25 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
福利彩票幸运号码自动生成器
2006/10/09 PHP
php 静态变量的初始化
2009/11/15 PHP
php设计模式 Builder(建造者模式)
2011/06/26 PHP
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
wordpress之js库集合研究介绍
2007/08/17 Javascript
CSS3,HTML5和jQuery搜索框集锦
2014/12/02 Javascript
jquery复选框多选赋值给文本框的方法
2015/01/27 Javascript
浅谈javascript中基本包装类型
2015/06/03 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
Bootstrap表单Form全面解析
2016/06/13 Javascript
谈谈第三方App接入微信登录 解读
2016/12/27 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
详解vue更改头像功能实现
2019/04/28 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
Vue Render函数原理及代码实例解析
2020/07/30 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
2014/01/22 Python
python之pandas用法大全
2018/03/13 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
Django中间件基础用法详解
2019/07/18 Python
Python如何输出整数
2020/06/07 Python
python实现简单遗传算法
2020/09/18 Python
如何在 Matplotlib 中更改绘图背景的实现
2020/11/26 Python
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
2014年党员自我评价材料
2014/09/22 职场文书
授权委托书范本(单位)
2014/09/28 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
裁员通知
2015/04/25 职场文书
黑暗中的舞者观后感
2015/06/18 职场文书
承诺书的内容有哪些,怎么写?
2019/06/21 职场文书
opencv 分类白天与夜景视频的方法
2021/06/05 Python
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL