guanguans / notify

Push notification SDK(AnPush、Bark、Chanify、DingTalk、Discord、Gitter、GoogleChat、IGot、Lark、Mattermost、MicrosoftTeams、NowPush、Ntfy、Push、Pushback、PushBullet、PushDeer、Pushover、PushPlus、QQ、RocketChat、ServerChan、ShowdocPush、SimplePush、Slack、Telegram、WeWork、WPush、XiZhi、YiFengChuanHua、Zulip).
MIT License
634 stars 45 forks source link

Return type of Guanguans\Notify\Foundation\Response::offsetGet($offset) should either be compatible with ArrayAccess::offset Get(mixed $offset): mixed #85

Closed PrintNow closed 3 months ago

PrintNow commented 3 months ago

运行环境 & 代码片段

PHP 版本:8.2

PHP 8.2.16 (cli) (built: Mar  7 2024 08:55:56) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.16, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.16, Copyright (c), by Zend Technologies

代码片段

<?php

use Guanguans\Notify\Lark;

$authenticator = new Lark\Authenticator('32d5d7e0-54f3-45b5-a02a-66666666666');
$larkClient = new Lark\Client($authenticator);

$cardMessage = Lark\Messages\CardMessage::make([
    "header" => [
        "template" => "red",
        "title" => [
            "content" => "标题标题标题标题标题标题标题",
            "tag" => "plain_text",
        ],
    ],
    "elements" => [
        [
            "tag" => "div",
            "text" => [
                "content" => "测试消息测试消息测试消息测试消息测试消息测试消息测试消息",
                "tag" => "lark_md",
            ],
        ]
    ]
]);

$larkClient->send($cardMessage);

异常位置:

https://github.com/guanguans/notify/blob/a1a0db7e96980deb460560b40efce3d67efeeca3/src/Foundation/Concerns/HasOptions.php#L113

完整错误信息:

PHP Fatal error:  During inheritance of ArrayAccess: Uncaught ErrorException: Return type of Guanguans\Notify\Foundation\Response::offsetGet($offset) should either be compatible with ArrayAccess::offset
Get(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /app/vendor/guanguans/notify/src/Foundation/Response.php:545
Stack trace:
#0 /app/vendor/guanguans/notify/src/Foundation/Response.php(38): Hyperf\ExceptionHandler\Listener\ErrorExceptionHandler::Hyperf\ExceptionHandler\Listener\{closure}()
#1 /app/vendor/composer/ClassLoader.php(576): include('...')
#2 /app/vendor/composer/ClassLoader.php(427): Composer\Autoload\{closure}()
#3 /app/vendor/guanguans/notify/src/Foundation/Middleware/Response.php(29): Composer\Autoload\ClassLoader->loadClass()
#4 /app/vendor/guzzlehttp/promises/src/FulfilledPromise.php(48): Guanguans\Notify\Foundation\Middleware\Response::Guanguans\Notify\Foundation\Middleware\{closure}()
#5 /app/vendor/guzzlehttp/promises/src/TaskQueue.php(52): GuzzleHttp\Promise\FulfilledPromise::GuzzleHttp\Promise\{closure}()
#6 /app/vendor/guzzlehttp/promises/src/Promise.php(251): GuzzleHttp\Promise\TaskQueue->run()
#7 /app/vendor/guzzlehttp/promises/src/Promise.php(227): GuzzleHttp\Promise\Promise->invokeWaitFn()
#8 /app/vendor/guzzlehttp/promises/src/Promise.php(272): GuzzleHttp\Promise\Promise->waitIfPending()
#9 /app/vendor/guzzlehttp/promises/src/Promise.php(229): GuzzleHttp\Promise\Promise->invokeWaitList()
#10 /app/vendor/guzzlehttp/promises/src/Promise.php(69): GuzzleHttp\Promise\Promise->waitIfPending()
#11 /app/vendor/guzzlehttp/guzzle/src/Client.php(189): GuzzleHttp\Promise\Promise->wait()
#12 /app/vendor/guanguans/notify/src/Foundation/Client.php(52): GuzzleHttp\Client->request()
#13 /app/app/Process/ExceptionReportProcess.php(61): Guanguans\Notify\Foundation\Client->send()
#14 /app/vendor/hyperf/process/src/AbstractProcess.php(99): App\Process\ExceptionReportProcess->handle()
#15 [internal function]: Hyperf\Process\AbstractProcess->Hyperf\Process\{closure}()
#16 {main} in /app/vendor/guanguans/notify/src/Foundation/Response.php on line 38

不太清楚(未仔细研究)是否有特殊用意,而未加返回值签名 https://github.com/guanguans/notify/blame/a1a0db7e96980deb460560b40efce3d67efeeca3/src/Foundation/Concerns/HasOptions.php#L113

guanguans commented 3 months ago

@PrintNow 有时间了我看一下。

guanguans commented 3 months ago

@PrintNow 更新到最新版本试试。没写返回类型是因为 7.4 版本并不支持 mixed 类型。不过之前 8.3 环境下测试居然能通过,我也是很纳闷儿。

PrintNow commented 3 months ago

@guanguans 可以用了 👍

可能是我开了严格模式 declare(strict_types=1); 就测出来了?😂

guanguans commented 3 months ago

@guanguans 可以用了 👍

可能是我开了严格模式 declare(strict_types=1); 就测出来了?😂

应该不是这个问题,我源码一直都是开着的。我本地测试的话,8.1、8.2、8.3 下是一个 Deprecated 级别的错误,并不是 Fatal 级别的。

guanguans commented 3 months ago

@PrintNow 查了一下,大概率是框架处理的错误的机制的原因。不过话说 Hyperf 把一个 Deprecated 级别的错误转化成 ErrorException 异常抛出来似乎是不太合理的吧。Laravel 中的话只会把 Deprecated 级别的错误通过日志渠道记录下来。

PrintNow commented 3 months ago

@guanguans 是这里吗?hyperf/exception-handler/src/Listener/ErrorExceptionHandler.php#L31

确实很令人疑惑,为什么要这么做,不知道是故意的还是这么写😅

guanguans commented 3 months ago

@guanguans 是这里吗?hyperf/exception-handler/src/Listener/ErrorExceptionHandler.php#L31

确实很令人疑惑,为什么要这么做,不知道是故意的还是这么写😅

应该是这块儿了。

PrintNow commented 3 months ago

@guanguans 是这里吗?hyperf/exception-handler/src/Listener/ErrorExceptionHandler.php#L31 确实很令人疑惑,为什么要这么做,不知道是故意的还是这么写😅

应该是这块儿了。

我发起个 issue 问问🤔