die();
// require_once VENDOR_PATH.'topthink/think-captcha/src/Captcha.php';
// return (new \think\captcha\Captcha()) -> entry();
return captcha_img();
return json(['checkCode'=>captcha_src(),'token'=>createUUID()]);
}
public function myTest(){
$a = [];
echo $a['key'];
}
}
估计很多人在使用tp5框架或者迁移项目换了tp5框架时,由于代码的不规范(变量未声明就直接使用),很容易出现这种Notice级别的报错,其原因在于:
1. public/目录下的入口文件:index.php
require __DIR__ . '/../thinkphp/start.php';2. thinkphp/目录下的start.php
namespace think; // ThinkPHP 引导文件 // 加载基础文件 require __DIR__ . '/base.php'; // 执行应用 App::run()->send();
3. base.php文件定义了核心常量及加载类文件。
// 注册自动加载 \think\Loader::register(); // 注册错误和异常处理机制 \think\Error::register(); // 加载惯例配置文件 \think\Config::set(include THINK_PATH . 'convention' . EXT);
注意Error::register();该文件Error.php位入thinkphp/library/think/Error.php
public static function register() { error_reporting(E_ALL); set_error_handler([__CLASS__, 'appError']); set_exception_handler([__CLASS__, 'appException']); register_shutdown_function([__CLASS__, 'appShutdown']); }error_reporting(E_ALL);也就是报告任何错误。
然后看tp5手册对《错误与调试》部分对此的说明:
本着严谨的原则,5.0版本默认情况下会对任何错误(包括警告错误)抛出异常,如果不希望如此严谨的抛出异常,
可以在应用公共函数文件中或者配置文件中使用error_reporting
方法设置错误报错级别(请注意,在入口文件中设置是无效的),
例如:
error_reporting(E_ERROR | E_PARSE );
因此,根据tp5框架加载原则,即使在入口文件添加了error_reporting(E_ERROR | E_PARSE )依然无效,因为会被后面的代码覆盖。
故参考tp手册,我们可以在项目目录application/Module/下的common.php或者config.php下文件添加
error_reporting(E_ERROR | E_PARSE );
注意:config.php添加error_reporting(E_ERROR | E_PARSE );要在return [];之前添加。
当然,除了以上两种方式外,我们还可以在控制器代码添加error_reporting(E_ERROR | E_PARSE );来避免代码不规范引起的频繁报错。
个人建议最好是在config.php文件添加以上代码。
按照tp5文件加载顺序,应用配置文件config.php优先于common.php加载。
以上代码均由本人亲自测试有效:
总结:解决notice、warning报错的方案有
1. 修改框架源码(强烈建议不要使用此方法,破坏框架设计原则--代码严谨性)
error_reporting(E_ALL);
修改为error_reporting(E_ERROR | E_PARSE );
2.应用配置文件config.php添加(如果忽略代码严谨性原则,强烈推荐使用)
error_reporting(E_ERROR | E_PARSE );
3.应用公共文件common.php添加
error_reporting(E_ERROR | E_PARSE );
4.控制器添加(此方式只对本控制器执行的代码有效,并非全局有效,作局部屏蔽使用。)
error_reporting(E_ERROR | E_PARSE );
5.根据4衍生而来,建立Base控制器(此方式对所有控制器均有效。)
Base控制器 extends \think\Controller,然后添加如下代码
public function _initialize(){
parent::_initialize();
error_reporting(E_ERROR | E_PARSE );
}
然后让所有控制器都继承Base控制器即可。
最后,本着代码严谨性原则,遵循开发规范,强烈推荐大家在开发中不要忽略notice和warning错误的报告。问题早发现,早解决。