WordPress Ping Optimizerを入れたところ、WordPress内に

Warning: count(): Parameter must be an array or an object that implements Countable in /xxx/wp-content/plugins/wordpress-ping-optimizer/cbnet-ping-optimizer.php on line 533

というエラーが出たので、消して欲しいという相談を受けました。ネットを検索すると、同様のトラブル報告と解決法の記事がありますが、せっかく記事にするので、また別の解決法を書いておきます。

そもそも、何故このエラーが発生するのか?

PHP7.2から count()関数の定義が変わったからです。

7.2.0 : count() will now yield a warning on invalid countable types passed to the array_or_countable parameter.

http://php.net/manual/ja/function.count.php

「count()は、array_or_countableパラメータに渡される無効な可算型について警告を出すようになりました。」とのことです。

つまり、サーバーで動かしているPHPのバージョンが5までならばエラーが出なかったものが、7のバージョンに上げることで、 count() の定義が変わり、WordPress Ping Optimizerのプログラミングミスが露出したということです。

では具体的にプログラミングミスの箇所を見ていきましょう。

どこがプログラミングミスなのか?

cbnet-ping-optimizer.php の533行を見るとこうあります。

ということは、 $this->cbnetpo_future_pings に入っているパラメーターの型が「無効だ」とエラーが出ているということになります。その周辺のコードを見てみます。

とあります。

まずは、 $this->cbnetpo_future_pings に収納されている型をチェックしてみると、  boolean と判定されました。で次に

とありますが、 boolen の型の変数を is_null では判定出来ないのです。

https://qiita.com/ExA_DEV/items/560cd9d999a4d1836f36

常に、 FALSEとなる為に、

の行へ行ってしまいます。そして、 boolen の型の変数が count() 関数に収納された結果、「配列じゃないから、count()では合計出来ない」とエラーが発生しているのです。

そこで、ネット上の回避方法として、

と書き換えればOKと出ています。もちろん、この方法で問題ありません。

別の書き換え方法

文頭で「せっかく記事にするのだから、別の書き換え方法を」と書きました。私の思いついた方法は、

と書き換える方法です。

つまり、

の行で「配列じゃない」という理由でエラーが発生しているのだから、

にて、 $this->cbnetpo_future_pings が「空の配列ならば TRUEを返す」としています。そうすると、

の方が実行されることになり

が実行されなくなります。従って、エラーが発生しません。

まとめ

ネット上の方法を使ってエラーを回避しても良いですし、「自分は珍しい方法を使うんだ」という方は、私の考えた方法を使ってみるのも良いでしょう。

プラグインの制作者の意図を汲むと、私の方法の方が良いのではないかと、考えております。