PHPの「Fatal error: Can’t use function return value in write context」に要注意 (WordPressで管理画面に入れないことも)

ということで先ほどプラグインを更新したときにいきなり発生した事態について書いてみます。「いったい何事?」と考えてしまいましたが理由がわかればプログラムの修正でなんとかなるのですが、知識がない人にもわかるようにいろいろと書いてみます。

 

PHPのとある処理に起因する問題

エラーメッセージで検索すれば詳しく出てくるので詳しくは書きませんが、もしPHPやHTTPサービスのログを直接見られる場合はこんなログが書いてあることがあります。

PHP Fatal error:  Can't use function return value in write context

このエラーですが、調べてみると関数に見えるPHPの演算子(に近いのかな?)に対して関数の戻り値を直接渡した場合エラーとなる、というものです。よくあるのがisset()やempty()に関数の戻り値を直接渡す場合、例としては

function hoge()
{
	return array(...);
}

if(empty(hoge())){

}
else{

}

というものです。この場合、エラーを避けるためには一時的に変数に関数の戻り値を受け取ってからempty()やisset()に判定させる必要がある、つまり

function hoge()
{
	return array(...);
}

$ret = hoge()
if(empty($ret)){

}
else{

}

としなければならない、ということだそうです。で、もう一つ重要なポイントとしてはPHP5.5以降であればempty()については関数の戻り値を直接渡してもエラーとならない、ということになったようです。今回引っかかったのがこれです。

 

EWWW Image Optimizerを3.2.0に更新したら管理画面に入れなくなった…

つまり見事に上の現象に引っかかってしまったわけです。私の場合はエラーログを直接確認できる立場だったので何が起こったのか即座に判定してなんとかしたわけですが知らない人だと検索しても出てこないのでたぶん大変ですね…。まあ、レンタルサーバーなんかだとPHP5.5系以上のはずなので問題ないはずですが…。

 

PHPのバージョンを上げるか回避処理を追加しよう

通常はバージョンを5.5以上にあげる処理を行えばOKです。もしそれができないのであれば一時的に変数に受け取ってempty関数に渡すようにスクリプトを変更することで回避しましょう、とだけ書いておきます。どんなスクリプトになるのか知りたい方はコメント欄にでも要望を書いておいてください。あとで追記するかもしれません。

 

12:00 追記

EWWW Image Optimizerですが、3.2.1で修正されていることを確認しました。なので手動修正としては3.2.1のコードを手元にダウンロードしてbulk.phpをFTP経由などで書き換えることで対応することが可能です。この手の問題って確認漏れなのでいろいろな環境で試さないとだめなのとバグ報告の早さおよび対応の早さが評価の鍵となってしまいますかね。

 


コメントを残す

メールアドレスが公開されることはありません。

*

この記事のトラックバック用URL