PHP7にしたらCakePHP2やWordPressで(ちょびっとだけ)不具合が出た

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
php7

この記事を三行にまとめると

PHP7にちょいとバージョンアップしてみました
とりあえず何も考えずに上げてしまいました
焦らずやってみてくださいな
あかつきのお宿はPHP5.6で動かしていたんですが、PHP7にちょいとバージョンアップしてみました。噂ではPHP7の方がメモリの消費量も少ないし処理速度もぐんと上がるって聞いたんで、上げといて損はないかなと。

でもちゃんと確認せず上げてしまったんで、CakePHP2やWordpressで一部動作しないところが出てしまいました。今回はそれについてのご報告。


CakePHP2

以前、CakePHP3をPHP7で動かした時は特に何の不具合も出なかったんで、CakePHP3でサイトを動かしてるなら、5.6から7に上げてもエラーは出ないかもしれません。

お宿はCakePHPの2.5.2で動かしていました。そしたらPHPを7にしたことで、以下のようなエラーが出ました。

PHP Fatal error: Cannot use ‘String’ as class name as it is reserved

Stringというクラスが使えねーよってエラーです。

どうやらPHP7では「int」や「string」のように型名と同じものをクラス名にはできないみたいです。

Stringクラスをオーバーライドして改修しても良いんですが、それよりはCakePHPのバージョンを上げちゃった方が早いと思います。バージョンを上げるとStringクラスが「CakeText」というクラスに変わっているので、上記のようなエラーは出ません。どのバージョンから変わったのかちゃんとは確かめてないけど、たぶん2.7以降かな。



これでエラーがなくなるなら問題ありませんが、僕はバージョンを上げたことで今度はCakePHP内でのエラーが出るようになってしまいました。

まずはフォームヘルパーのところでこんなエラーが出た。

Using key `action` is deprecated, use `url` directly instead.

フォームの飛び先を指定するところに「action」を使うなっていうエラーですかね。

$this->Form->create('Post', array('action' => '/post/add'));

こんな風に書いてあるとエラーになるみたいです。URLを指定する場合は「action」ではなく「url」を使ってくださいってことのようですね。

//actionをurlに変更
$this->Form->create('Post', array('url' => '/post/add'));

あとバリデーションのところで「notEmpty」を使っていたのですが、それもエラーが出ました。

Validation::notEmpty() is deprecated. Use Validation::notBlank() instead.

「notEmpty」ではなく「notBlank」を使えってことですね。

この辺はどのバージョンに上げたらエラーになるかをきちんと検証したわけではないので、同じようなエラーが出ていたら修正してあげてください。



WordPress

続いてWordpressの方ですが、PHPを7にしたら記事の本文が表示されなくなってしまったんですよ。「the_post()」に何か不具合があるのかなと思ったんですが、そういうわけではなかったようです。

僕は記事の本文を表示する際に、「brbrbr」というプラグインを使って改行をそのまま表示できるようにしているのですが、このプラグインに原因があったようです。

brbrbrを見ると、こんなコードがある。

$brbr = preg_replace('/(<pre.*?>)(.*?)<\/pre>/ise', "clr_br('$0')", $brbr);
$brbr = preg_replace('/(<script.*?>)(.*?)<\/script>/ise', "clr_br('$0')", $brbr);
$brbr = preg_replace('/(<form.*?>)(.*?)<\/form>/ise', "clr_br('$0')", $brbr);

preg_match()の修飾子にeを使っています。もともとe修飾子は非推奨だったみたいですが、PHP7では完全になくなってしまったので、この部分がエラーになっていたみたいです。

e修飾子を使わずに同じ動きを実装したいなら、「preg_replace_callback()」という関数を使うと良いです。

$brbr = preg_replace_callback('/(<pre.*?>)(.*?)<\/pre>/is', function($m) {return clr_br($m[0]);}, $brbr);
$brbr = preg_replace_callback('/(<script.*?>)(.*?)<\/script>/is', function($m) {return clr_br($m[0]);}, $brbr);
$brbr = preg_replace_callback('/(<form.*?>)(.*?)<\/form>/is', function($m) {return clr_br($m[0]);}, $brbr);

brbrbrを使っているなら、こうすれば今まで通りに「the_post()」で本文が表示されます。






今回僕が出したエラーは上記の通りですが、人によって出るエラーは違うかもしれません。ようするにバージョンを上げる時はちゃんとテストしなきゃねって話です。あかつきのお宿は今テスト環境的なものがないからとりあえず何も考えずに上げてしまいました。

5.6と7ではいろいろと変更点があるかもしれませんが、でも試してみた限りではどうしようもないくらい致命的なエラーはなさそうなんで、たとえ画面が真っ白になったとしても焦らずやってみてくださいな。

ちなみに実際に7に上げてみた感触としては、何とな〜く表示速度が早くなったような気はするし、何とな〜くメモリの消費も抑えられているような気もするんですが、ほとんど変わってないような気もするし……まだ何とも言えないところです。

いずれちゃんと検証してみましょうかね。
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください