[PHP]PHP7.0での変更点とアップグレード時の対応

Pocket

PHP 5.x 系列のメジャーアップデートとなる PHP 7.0 では、処理速度の大きな向上と言語仕様の変更が行われています。新機能と非推奨になった機能のうち、大きな影響を与える変更点についてまとめてみました。


POSIX 正規表現関数の廃止
5.3 の時点で非推奨となっていましたが、POSIX互換の正規表現に関する関数が取り除かれています。
影響を受けるのは以下の関数です。

ereg(), eregi(), ereg_replace(), eregi_replace, split(), spliti(), sql_regcase()

ereg に関連する殆どの関数が取り除かれました。今後は preg_match や preg_replace などの PCRE 系関数 を使うことになります。


ext/mysql 拡張の廃止
5.5 で非推奨になった mysql_ 系の関数が取り除かれました。代替となる PDO や mysqli が用意された現在でも古い参考書に惑わされて使用する人が多かったので良い変更だと思います。数が多すぎるので廃止となった関数は列挙しませんが「mysql_」で始まっている関数は今後使用できなくなります。前述の PDO や mysqli 系を使って下さい。


可変変数の新しい記述方法
多次元配列を可変変数として用いる際、${$var['foo']['bar']} のように { } を使って書いていましたが、PHP 7 では ($$var)['foo']['bar'] という書き方ができるようになります。
クラスメソッドやプロパティでは次のようにします。

// PHP 5.x;
$var->{$prop['key']};
$var->{$prop['key']}();

// PHP 7;
($var->$prop)['key'];
($var->$prop)['key']();

「::」のネスト
クラス定数や static メソッドに関する「::」がネストできるようになります。

$var::$class::$constant

関数が返す値に直接アクセスする
関数が返した callable(コールバック) や、callable を持つ変数から直接コールできます。

foo()();
$foo()();
$foo()['bar']();

無名クラスのサポート
「class」を用いてその場限りの無名クラス(Anonymous Class)を作ることができます。

$object = new class("Hello"){
    public $var;

    public function __construct($arg){
        $this->var = $arg;
    }
};

use のグループ化
use を用いる際にネームスペースをグループ化して複数のクラスを一括指定できるようになりました。

// 5.x
use Vendor\ComponentA\ClassA;
use Vendor\ComponentA\ClassB;
use Vendor\ComponentA\ClassC as Foo;

use Vendor\ComponentB\ClassD;
use Vendor\ComponentC\ClassE;

// 7.0
use Vendor\ComponentA\{ClassA, ClassB, ClassC as Foo};

use Vendor\{ComponentB\ClassD, ComponentC\ClassE}

Null 合体演算子(??)の追加
null となる可能性のある値を取得する際、今までは二項演算子で対処していました。

$foo = isset($bar) ? $bar : $baz;

PHP 7 では新しい演算子「??」を使って同じことを簡単にかけるようになりました。(文字化けしているのではありません)

$foo = $bar ?? $baz;

「??」は複数使うこともできます。$a が null なら $b の値を、$b も null なら $c の値が格納されます。

$var = $a ?? $b ?? $c;

宇宙船演算子(<=>)の追加
宇宙船演算子(Spaceship-Operator)と呼ばれることの多い「<=>」比較演算子が追加されました。
2つの値が同じなら 0 を、左の値が小さければ -1、大きければ +1 を返します。


配列を用いた定数
define() による定数の宣言で配列を指定できるようになりました。


preg_replace_callback_array() 関数の追加
preg_replace_callback_array() に正規表現のパターンと置換処理を配列の形で与えるとそれぞれの処理を同時に行うことができるようになります。


dirname() 関数の強化
パス文字列からディレクトリ名を返す dirname() に第2引数が指定できるようになり、何番目のディレクトリ名を取得するかを指定できるようになりました。

$path = '/dir1/dir2/dir3/example.txt';
dirname($path, 2); // 「/dir1/dir2」

password_hash() の salt オプション廃止
password_hash() のには手動でソルトを設定するためのオプションがありましたが廃止になりました。
使用箇所では E_DEPRECATED が発生します。


assert() の言語構造化
デバッグに用いてきた assert() が関数から言語構造となったことで、式を直接指定できるようになり、運用環境下でのでオーバーヘッドがなくなりました。


try〜catchで扱えるエラー種類の拡大
5.x では不可能だった PHP の通常エラーが「\Error」としてキャッチできるようになりました。
その他にも「\ParseError」や「\TypeError」などのエラーも扱えます。


Unicode拡張領域への対応
Unicode文字関する多くの機能を持つ IntlChar が導入され、絵文字などの名称を割り出したり、英数字かどうか判定したりするための機能が追加されました。


タイプヒンティングの強化
変数が配列かコールバックなのかを明示する機能は PHP 5.x にもありましたが、さらに使用できるタイプヒントの数が増え、以下の型も指定できるようになりました。

・bool
・float
・int
・string

関数で function(int $foo) とした時、「"100"」などの文字列を与えると int型の「100」に変換されます。
declare() 関数で「strict_types=1」 とすることで自動変換を無効化し、適切な型の値が与えられなかった場合「\TypeError」を発生させることもできます。

返り値にもタイプヒンティングが利用でき、次のように指定します。

function example(string $str): int
{
    //
}

ここで紹介したのは新機能のごく一部で、実際にはもっと多くの変更があります。
詳細については公式マニュアルが参考になると思います。

Migrating from PHP 5.6.x to PHP 7.0.x


Similar Posts:




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です