PHP框架自动加载类文件原理详解
2017-06-06 16:17
861 查看
描述:公司项目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 自动加载规范 psr0 psr4 详解
- PHP __autoload()函数(类文件自动加载规则)的使用方法
- phpexcel的自动加载与其他框架有冲突
- php spl_autoload_register类库自动加载,省去引入类文件
- PHP autoload(自动加载)代码机制详解
- 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间
- PHP面向对象自动加载机制原理与用法分析
- PHP中的use、命名空间、引入类文件、自动加载类的理解
- PHP命名空间与自动加载类详解
- PHP中的use、命名空间、引入类文件、自动加载类的理解
- PHP-自动加载原理分析
- PHP自动加载类文件
- phpexcel的自动加载与其他框架有冲突
- 菜鸟学php扩展 之 自动生成的扩展框架详解(二)
- 详解PHP文件的自动加载(autoloading)
- PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
- PHP面向对象自动加载机制原理与用法分析
- PHP autoload和spl_autoload自动加载机制详解
- PHP自动加载功能原理解析
- php类文件的自动加载机制__autoload,spl