thinkphp 导入whoops调试库(非标准类库文件)

我想在https://github.com/filp/whoops导入whoops调试库,代码大致如下

namespace Whoops;

use InvalidArgumentException;
use Whoops\Exception\ErrorException;
use Whoops\Exception\Inspector;
use Whoops\Handler\CallbackHandler;
use Whoops\Handler\Handler;
use Whoops\Handler\HandlerInterface;
use Whoops\Util\Misc;
use Whoops\Util\SystemFacade;

final class Run implements RunInterface
{//省略}

图片描述
图片描述

如果我通过import('MyClass',APP_PATH.'Whoops','.php');导入Run类文件,那么RunInterface这个文件需要再import,那么有无什么方法不修改文件名,正常导入吗

阅读 2.5k
1 个回答

你要单独创建一个文件夹,又要让框架自动加载,那就得修改框架。

ThinkPHP\Library\Think\Think.class.php


    /**
     * 类库自动加载
     * @param string $class 对象类名
     * @return void
     */
    public static function autoload($class) {

        // 检查是否存在映射
        if(isset(self::$_map[$class])) {
         
            include self::$_map[$class];
        }elseif(false !== strpos($class,'\\')){
         
          $name           =   strstr($class, '\\', true);
          if(in_array($name,array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH.$name)){ 
              // Library目录下面的命名空间自动定位
              $path       =   LIB_PATH;
          ###############################     
          }else if($name == 'Whoops'){

              $path       =  './';
          ###############################     

          }else{
              // 检测自定义命名空间 否则就以模块为命名空间
              $namespace  =   C('AUTOLOAD_NAMESPACE');
              $path       =   isset($namespace[$name])? dirname($namespace[$name]).'/' : APP_PATH;
          }
          ############################### 
          if($name == 'Whoops'){
            $filename       =   $path . str_replace('\\', '/', $class) . ".php";
          ###############################   

          }else{
            $filename       =   $path . str_replace('\\', '/', $class) . EXT;

          }
          
          if(is_file($filename)) {
              // Win环境下面严格区分大小写
              ###############################
              if($name != 'Whoops'){
              ###############################  
                if (IS_WIN && false === strpos(str_replace('/', '\\', realpath($filename)), $class . EXT)){
                  return ;
                }
              ###############################   
              }
              ############################### 
              include $filename;
          }
        }elseif (!C('APP_USE_NAMESPACE')) {
            // 自动加载的类库层
            foreach(explode(',',C('APP_AUTOLOAD_LAYER')) as $layer){
                if(substr($class,-strlen($layer))==$layer){
                    if(require_cache(MODULE_PATH.$layer.'/'.$class.EXT)) {
                        return ;
                    }
                }            
            }
            // 根据自动加载路径设置进行尝试搜索
            foreach (explode(',',C('APP_AUTOLOAD_PATH')) as $path){
                if(import($path.'.'.$class))
                    // 如果加载类成功则返回
                    return ;
            }
        }
    }


改完之后就能调用了
new \Whoops\Exception\ErrorException();
new \Whoops\Run(); 
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题