PHP框架自动加载类文件原理详解

5年以前  |  阅读数:380 次  |  编程语言:PHP 

描述:公司项目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分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例