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.
「count()は、array_or_countableパラメータに渡される無効な可算型について警告を出すようになりました。」とのことです。
つまり、サーバーで動かしているPHPのバージョンが5までならばエラーが出なかったものが、7のバージョンに上げることで、 count() の定義が変わり、WordPress Ping Optimizerのプログラミングミスが露出したということです。
では具体的にプログラミングミスの箇所を見ていきましょう。
どこがプログラミングミスなのか?
cbnet-ping-optimizer.php の533行を見るとこうあります。
1 |
$pingCount=count($this->cbnetpo_future_pings); |
ということは、 $this->cbnetpo_future_pings に入っているパラメーターの型が「無効だ」とエラーが出ているということになります。その周辺のコードを見てみます。
1 2 3 4 |
if (is_null($this->cbnetpo_future_pings)) $pingCount=0; else $pingCount=count($this->cbnetpo_future_pings); |
とあります。
まずは、 $this->cbnetpo_future_pings に収納されている型をチェックしてみると、 boolean と判定されました。で次に
1 |
is_null($this->cbnetpo_future_pings) |
とありますが、 boolen の型の変数を is_null では判定出来ないのです。
https://qiita.com/ExA_DEV/items/560cd9d999a4d1836f36
常に、 FALSEとなる為に、
1 |
$pingCount=count($this->cbnetpo_future_pings); |
の行へ行ってしまいます。そして、 boolen の型の変数が count() 関数に収納された結果、「配列じゃないから、count()では合計出来ない」とエラーが発生しているのです。
そこで、ネット上の回避方法として、
1 |
$pingCount=count($this->cbnetpo_future_pings); |
を
1 |
$pingCount = $this->cbnetpo_future_pings ? count( $this->cbnetpo_future_pings ) : 0; |
と書き換えればOKと出ています。もちろん、この方法で問題ありません。
別の書き換え方法
文頭で「せっかく記事にするのだから、別の書き換え方法を」と書きました。私の思いついた方法は、
1 |
if (is_null($this->cbnetpo_future_pings)) |
を
1 |
if (is_null($this->cbnetpo_future_pings) || empty($this->cbnetpo_future_pings)) |
と書き換える方法です。
つまり、
1 |
count($this->cbnetpo_future_pings); |
の行で「配列じゃない」という理由でエラーが発生しているのだから、
1 |
empty($this->cbnetpo_future_pings) |
にて、 $this->cbnetpo_future_pings が「空の配列ならば TRUEを返す」としています。そうすると、
1 |
$pingCount=0; |
の方が実行されることになり
1 |
count($this->cbnetpo_future_pings) |
が実行されなくなります。従って、エラーが発生しません。
まとめ
ネット上の方法を使ってエラーを回避しても良いですし、「自分は珍しい方法を使うんだ」という方は、私の考えた方法を使ってみるのも良いでしょう。
プラグインの制作者の意図を汲むと、私の方法の方が良いのではないかと、考えております。
出張ホスト募集要項