PHP 7.1升级后Twig 1.35报'A non-numeric value encountered'警告求助
这种问题我之前帮朋友排查过,PHP7.1开始对类型校验严格了不少,尤其是非数值参与运算的场景会直接抛警告,结合你用的Twig+CodeIgniter3,给你几个一步步落地的排查思路:
1. 先定位Twig编译后的代码问题
报错指向Twig/Environment.php里的eval('?>' . $content);,这里的$content是Twig模板编译后的PHP代码。你可以在这行代码前临时加一段输出,把编译后的代码存到文件里:
// 在eval行之前添加临时代码 file_put_contents('/tmp/twig_compiled_debug.php', $content);
访问触发警告的页面后,打开这个临时文件,重点搜索数值运算相关的代码——比如+、-、*、/这些运算符,看看有没有把字符串、null或者空值拿来做运算的情况。PHP7.1之前会静默把这些转成0,现在就会抛出你看到的警告。
2. 从编译代码反推回Twig模板
找到编译代码里有问题的运算行后,看它对应的模板标记(开启Twig调试的话会有行号注释,后面会说),比如编译后是echo ($context["product_count"] + 1);,就去模板里找{{ product_count + 1 }}的位置,检查控制器传给Twig的product_count是不是非数值类型——比如是空字符串、null,或者数据库里存的是文本而不是数字。
3. 升级Twig到兼容PHP7.1的版本
如果你的Twig版本比较旧(比如1.x早期版本),很可能是它对PHP7.1的类型严格性支持不足。建议升级到Twig 1.38+(1.x分支的最终稳定版,兼容PHP5.3+到7.x)或者2.x分支(需要PHP7.0+,刚好匹配你的环境)。CodeIgniter3和新版Twig兼容性没问题,只要你用的CodeIgniter Twig扩展(如果有的话)也同步适配就行。
4. 开启CodeIgniter的详细日志
打开application/config/config.php,调整日志配置:
$config['log_threshold'] = 4; // 记录所有级别日志 $config['log_path'] = './application/logs/'; // 确保这个目录有写入权限
这样日志里会记录更详细的错误上下文,包括触发警告的模板文件和具体行号,有时候能直接定位到问题点。
5. 开启Twig调试模式辅助定位
初始化Twig的时候开启调试模式,编译后的PHP代码会保留原模板的行号注释,方便你快速对应到模板里的位置:
$loader = new Twig_Loader_Filesystem(APPPATH . 'views'); $twig = new Twig_Environment($loader, array( 'debug' => true, // 你的其他Twig配置,比如缓存路径等 ));
之后编译后的代码里会有类似// line 45 in views/home.twig的注释,直接对应模板行号,排查效率会高很多。
6. 检查CodeIgniter控制器的变量传递
有时候控制器里传给Twig的变量看起来是数字,但实际是字符串类型(比如从表单提交、数据库查询结果里拿到的"99"而不是99),PHP7.1在做运算时就会警告。你可以在控制器里用var_dump($your_variable)检查变量类型,或者在Twig模板里做安全处理,比如:
{{ product_count is numeric ? product_count + 1 : 0 }}
内容的提问来源于stack exchange,提问作者Tom

