likeshop多商户PHP7.2报错Return value of EasyWeChat\BasicService\Jssdk\Client::getTicket() 报错修复方法

报错内容

likeshop多商户PHP7.2报错Return value of EasyWeChat\BasicService\Jssdk\Client::getTicket() 报错修复方法_第1张图片

问题原因

在 PHP 7.2 中出现的错误 “Return value of EasyWeChat\BasicService\Jssdk\Client::getTicket() must be of the type array, null returned” 而在 PHP 8.0 中却能正常执行,这可能是由于 PHP 7.2 和 PHP 8.0 在类型声明和错误处理方面的差异所导致。

  1. 类型声明的严格性: 在 PHP 7.2 中,函数的返回类型声明是相对严格的。如果函数声明了返回特定类型(在这个例子中是数组),但实际上返回了不匹配的类型(如 null),那么 PHP 将抛出一个类型错误。这就是为什么在 PHP 7.2 中你会看到这个错误。

  2. PHP 8.0 的类型系统改进: 在 PHP 8.0 中,类型系统有了显著的改进,特别是在处理 null 和类型不匹配的情况时更加灵活。PHP 8.0 引入了联合类型和 null 安全运算符等特性,这可能会影响函数如何处理返回类型和 null 值。

  3. 错误处理的差异: PHP 8.0 在错误处理方面也做了改进,它可能在遇到某些类型不匹配时不再抛出错误,而是进行了更加灵活的处理。

要解决 PHP 7.2 中的问题,你可以采取以下措施:

  • 检查 getTicket 方法的实现: 查看 EasyWeChat getTicket 方法的代码,确保在所有情况下都返回一个数组。如果有可能返回 null,你可以修改代码以返回一个空数组或进行适当的错误处理。

  • 更新 EasyWeChat 版本: 如果你使用的是旧版本的 EasyWeChat,考虑升级到最新版本。新版本可能已经修复了这个问题。

  • 错误处理: 在调用 getTicket 方法的地方添加错误处理逻辑,以防返回 null。

  • 考虑升级 PHP 版本: 如果适用,考虑升级到 PHP 8.0 或更高版本,以利用改进的类型系统和错误处理。

修复方法

替换 /vendor/overtrue/wechat/src/BasicService/Jssdk/Client.php 里的 getTicket 方法

public function getTicket(bool $refresh = false, string $type = 'jsapi'): array
{
    $cacheKey = sprintf('easywechat.basic_service.jssdk.ticket.%s.%s', $type, $this->getAppId());

    if (!$refresh && $this->getCache()->has($cacheKey)) {
        $cachedResult = $this->getCache()->get($cacheKey);
        if ($cachedResult === null) {
            // 处理缓存返回 null 的情况,返回空数组或抛出异常
            return []; // 或者 throw new RuntimeException('Cache returned null for jssdk ticket.');
        }
        return $cachedResult;
    }

    /** @var array $result */
    $result = $this->castResponseToType(
        $this->requestRaw($this->ticketEndpoint, 'GET', ['query' => ['type' => $type]]),
        'array'
    );

    // 确保结果是数组并且包含所需的数据
    if (!is_array($result) || !isset($result['expires_in'])) {
        // 处理 API 请求失败的情况,返回空数组或抛出异常
        return []; // 或者 throw new RuntimeException('Failed to retrieve jssdk ticket from API.');
    }

    $this->getCache()->set($cacheKey, $result, $result['expires_in'] - 500);

    if (!$this->getCache()->has($cacheKey)) {
        throw new RuntimeException('Failed to cache jssdk ticket.');
    }

    return $result;
}

在这个修改后的版本中,我添加了对缓存和 API 请求返回值的额外检查。如果 getCache()->get($cacheKey) 返回 null 或者 requestRaw 请求失败,函数将返回一个空数组,或者可以选择抛出一个异常。这样可以确保函数始终返回数组类型的值,符合其返回类型声明,从而避免在 PHP 7.2 中出现类型错误。

问题解决

你可能感兴趣的:(php,开发语言,设计模式,笔记)