jpush / jpush-api-php-client

JPush's officially supported PHP client library for accessing JPush APIs. 极光推送官方支持的 PHP 版本服务器端 SDK。
https://docs.jiguang.cn
MIT License
522 stars 174 forks source link

因PHP 7.2.* 对count()的使用更加严格,报Warning警告 #70

Closed myshero closed 6 years ago

myshero commented 6 years ago

支持的 PHP 版本: 5.3.3 ~ 5.6.x, 7.0.x 若需要兼容 PHP 5.3.3 以下版本,可以使用 v3 分支的代码。 因为运行 Composer 需要 PHP 5.3.2+ 以上版本,所以其不提供 Composer 支持, 也可以点击链接下载 v3.4.x 版本源码。

测试运行环境
PHP 7.2.1 (cli) (built: Jan  4 2018 04:29:12) ( ZTS MSVC15 (Visual C++ 2017) x86 )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies

SDK 版本号  3.5.27

虽然已经说明支持的范围,但是为了更多的兼容和可用。 建议在SDK中判断是否为空的时候不要直接用 count() 来判别,举个栗子:

在 jpush\jpush\src\JPush\PushPayload.php 中 Line 318

if (count($this->smsMessage)) {
    $payload['sms_message'] = $this->smsMessage;
}

运行后: PHP Warning – yii\base\ErrorException count(): Parameter must be an array or an object that implements Countable

若作如下修改则运行成功(此处仅为抛砖引玉式示例)

 if (!empty($this->smsMessage) && is_array($this->smsMessage)) {
     $payload['sms_message'] = $this->smsMessage;
 }
ghost commented 6 years ago

这个问题在于那些实例变量的初始值是 null,而不是空数组,在每一个设置函数里面才初始化为空数组,使用 count() 从语义上也讲不通。也不知道为啥其他地方是用 is_null() 来判断,到这两个地方换成了判断数组的长度。

if (!is_null($this->smsMessage)) {
    $payload['sms_message'] = $this->smsMessage;
}

如上所示判断其实就够了,将会在下周发一个小版本。

感谢你能够用如此丰富的信息提出这个 issue。

另外,多一句嘴,

因PHP 7.2.* 对count()的使用更加严格,报Warning错误

应该是,报了警告(warning),并不是错误(error)

ghost commented 6 years ago

已经发了一个新版,你可以 update 试试