You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用KLogger调用日志方法时报错需传入数组却收到字符串如何解决?

错误根源

报错的直接原因是你调用KLogger日志方法时的第二个参数逻辑错误:你写的三元表达式(empty($array) ? $array : '')逻辑完全相反——当传入的$array非空时,返回的是空字符串'',而KLogger遵循PSR-3日志规范,要求第二个$context参数必须为数组类型,因此触发类型错误。
你测试时传入的['test' => 'hi']是非空数组,所以实际传给$logger->error()的第二个参数是空字符串,和要求的array类型不匹配,这就是你修改函数参数声明也解决不了问题的原因,错误根本不在函数参数接收环节。

修复方法
  1. 修正所有日志调用的第二个参数
    直接去掉错误的三元表达式,直接传入$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,绝对不能返回字符串。

  1. 可选代码优化
    你当前的多分支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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 03:45:01