PHP 7.2にアップグレードする時にやったこと

こんにちは、さるまりんです。

PHP 5.6のセキュリティサポートがこの年末、2018年12月31日で終わります。

このタイミングでPHP 7.2にバージョンアップしようという機会が何度かあったのでメモさせてもらいます。

PHP 7.2で何が変わったかということについては本家の付録に載っておりますのでそちらを参考にしてもらうとして、ここでは実際に僕がやったことを書いておきます。

やったことは4つです。

コンストラクタの変更 – クラスと同名の関数は使わない

いつの話だ?という内容ですが、クラスと同名の関数をコンストラクタとしているところがまだありました。

PHP 4までではクラスと同名の関数を定義するとそれがコンストラクタとみなされていました。PHP 5からコンストラクタは__construct()で定義するようになりました。このクラスと同名の関数をコンストラクタとすることがPHP 7では非推奨となったので変更です。

これ

class MyClass {
    public function MyClass() {
        //... コンストラクタでやること
    }
}

から、これ

class MyClass {
    public function __construct() {
        //... コンストラクタでやること
    }
}

です。

コンストラクタについてはこちらに詳しく記載されています。

preg_replace()/e修飾子をpreg_replace_callback()に変更

preg_replace()/eを使っているとこんな警告が出ます。

PHP Warning:  preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /aaa/bbb/ccc.php on line x

これが発生しないように変更です。それにはpreg_replace_callback()を使います。

$str = preg_replace("/正規表現/e","やりたいこと('$0')",$str);

$str = preg_replace_callback("/正規表現/",
    function ($m) {
        return やりたいこと($m[0]);
    },
    $str);

に変更です。この/eもPHP 5.5から非推奨となっているようなのでのん気な対応ですね。

staticでない関数のstaticな呼び出しをやめる

PHP 5ではこんなのがOKでした。

class MyClass {
    public function myFunction() {
        // myFunctionのやること
    }
}
MyClass::myFunction();

これはPHP 7では非推奨として警告が発生します。なので

class MyClass {
    public static function myFunction() {
        // myFunctionのやること
    }
}
MyClass::myFunction();

と変更します。

静的な関数はちゃんとstaticとして定義しないといけないということですね。

参照渡しには変数しか使えません

こんな警告も出ます。

Only variables should be passed by reference

見出しにもあるように関数呼び出し時「参照渡しは変数でないといけないですよ」ということのようです。

次のコードで上記が発生します。

// ファイルのパス
$path = 'my.file.is.image.jpeg';
// 拡張子を取得する
$extension = end(explode('.', $path));

explode()で文字列を分割しend()で配列の最後の要素を取得。

なのですがに渡すものが変数でないといけないそうです。ですので

// ファイルのパス
$path = 'my.file.is.image.jpeg';
// .ごとに区切った配列にする
$parts = explode('.', $path);
// 配列の最後を拡張子として取得する
$extension = end($parts);

と変更します。

他にもあるのかもしれないですが、僕が対応したプログラムはこれだけ探してやるとうまく動きました。思い切ってバージョンをあげる時、いろいろ対応することがありますね。

今回、PHP 7.2にあげましたが、つい先日、2018年12月6日に7.3がリリースされたそうです。どこが変わっているんでしょうね。またみてみます。(え?すぐにやれ?)

読んでくださってありがとうございました。

ではまた!