使用KLogger调用日志方法时报错需传入数组却收到字符串如何解决?
错误根源
报错的直接原因是你调用KLogger日志方法时的第二个参数逻辑错误:你写的三元表达式(empty($array) ? $array : '')逻辑完全相反——当传入的$array非空时,返回的是空字符串'',而KLogger遵循PSR-3日志规范,要求第二个$context参数必须为数组类型,因此触发类型错误。
你测试时传入的['test' => 'hi']是非空数组,所以实际传给$logger->error()的第二个参数是空字符串,和要求的array类型不匹配,这就是你修改函数参数声明也解决不了问题的原因,错误根本不在函数参数接收环节。
修复方法
- 修正所有日志调用的第二个参数
直接去掉错误的三元表达式,直接传入$array即可,PSR-3规范本身支持空数组作为context参数,不需要额外做判断。所有类似:
$logger->error($string.' - '.$filename . ($filename_get == '-' ? null : '?'.$filename_get), (empty($array) ? $array : ''));
的代码统一修改为:
$logger->error($string.' - '.$filename . ($filename_get == '-' ? '' : '?'.$filename_get), $array);
如果你确实需要做空数组兼容,也必须保证返回值始终为数组类型,可写为empty($array) ? [] : $array,绝对不能返回字符串。
- 可选代码优化
你当前的多分支if...elseif判断过于冗余,可以简化为动态方法调用,减少重复代码:
function logger($string, array $array, $type = 'info') { global $filename, $filename_get; $dir = '/destination/somewhere/on-the-server'; if(!file_exists($dir)) { create_folder($dir); } $logger = new Katzgrau\KLogger\Logger($dir); // 校验合法日志等级,避免调用不存在的方法 $allowTypes = ['emergency','alert','critical','error','warning','notice','info','debug']; $type = in_array($type, $allowTypes) ? $type : 'info'; // 处理debug等级和其他等级的字符串拼接差异 $joinChar = $type == 'debug' ? ' ' : ' - '; // 动态调用对应日志方法 $logger->{$type}( $string . $joinChar . $filename . ($filename_get == '-' ? '' : '?'.$filename_get), $array ); }
内容的提问来源于stack exchange,提问作者user718990
相关产品推荐
相关产品推荐

