PHP 7.0.x から PHP 7.1.x への移行
PHP Manual

下位互換性のない変更点

関数に渡す引数が少ない場合の挙動

これまでのバージョンでは、ユーザー定義の関数に渡す引数が足りない場合は warning が発生していました。PHP 7.1 以降では、warning ではなく Error 例外が発生するようになります。 この変更はユーザー定義の関数に対してだけのもので、 内部関数には影響を及ぼしません。

<?php
function test($param){}
test();

上の例の出力は、 たとえば以下のようになります。

Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d

スコープを調べる関数の動的呼び出しの禁止

ある種の関数について、動的な呼び出し ($func()array_map('extract', ...) のような形式) が使えなくなりました。対象になるのは、別のスコープを調べたり変更したり、 あいまいな挙動になってしまったりするような関数です。 この変更の影響を受ける関数は、以下のとおりです。

<?php
(function () {
    
$func 'func_num_args';
    
$func();
})();

上の例の出力は以下となります。

Warning: Cannot call func_num_args() dynamically in %s on line %d

クラス、インターフェイス、トレイトに使えない名前

これらのキーワードが、クラスやインターフェイスやトレイトの名前として使えなくなりました。

数値形式文字列の変換が科学記法に対応

数値形式の文字列の演算や型変換が、科学記法に対応するようになりました。 (int) によるキャストや、 intval() (基数が10の場合)、 settype()decbin()decoct()dechex() といった関数もその対象です。

mt_rand() のアルゴリズムの修正

mt_rand() のデフォルトが、修正版のメルセンヌ・ツイスタ アルゴリズムを使うようになりました。mt_srand() の結果に依存するコードを書いていた場合は、mt_srand() のオプションの第二引数に MT_RAND_PHP を指定すると、これまでの挙動 (間違った実装) を維持できます。

rand()srand() が、 それぞれ mt_rand()mt_srand() のエイリアスとなる

rand()srand() は、それぞれ mt_rand()mt_srand() のエイリアスになりました。つまり、 rand()shuffle()str_shuffle()array_rand() の出力がこれまでのバージョンとは変わるということです。

ASCII 制御文字 delete は識別子として使えない

ASCII 制御文字 delete (0x7F) は、 クォートしない限りは識別子として使えなくなりました。

error_logsyslog を指定した場合の変更

INI 項目 error_log の設定値を syslog にした場合に、PHP のエラーレベルが syslog のエラーレベルにマッピングされるようになりました。 これまでのバージョンではすべてのエラーが notice レベルで記録されていましたが、 この変更によって、今までよりも細やかな区別ができるようになります。

未完成のオブジェクトのデストラクタは呼び出されない

オブジェクトのコンストラクタの実行中に例外がスローされた場合に、 そのオブジェクトのデストラクタが呼ばれることはなくなりました。 以前のバージョンでは、場合によっては (例: そのオブジェクトが例外バックトレースなどで外部から参照される場合) デストラクタが呼ばれることもありました。

参照渡しの引数の call_user_func() での扱い

引数を参照渡しで受け取る関数を call_user_func() から呼んだときに、例外が発生するようになりました。 以前のバージョンでは、完全修飾形式の呼び出しであるか否かによってこの場合の挙動が異なっていました。

さらにこの場合、call_user_func()call_user_func_array() は関数呼び出しを中断しなくなりました。 "expected reference" という警告は出すものの、処理自体はそのまま続行します。

文字列における空のインデックス演算子はサポートしない

文字列に空のインデックス演算子を適用する (例: $str[] = $x) と、fatal エラーが発生します。これまでのバージョンではエラーにならず、 ただ配列に変換されるだけでした。

削除された INI 項目

以下の INI 項目は、削除されました。

参照による代入で自動的に作られる配列の要素の並び順の変更

参照による代入で配列の要素が自動的に作られる場合に、その並び順が変更されました。

<?php
$array 
= [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
?>

上の例の PHP 7.0 での出力は、このようになります。

array(2) {
  ["a"]=>
  &int(1)
  ["b"]=>
  &int(1)
}

上の例の PHP 7.1 での出力は、このようになります。

array(2) {
  ["b"]=>
  &int(1)
  ["a"]=>
  &int(1)
}

同値な要素の並び順

内部的なソートアルゴリズムが改良されたことに伴って、 比較したときに等しいとみなされる要素の並び順が以前とは変わるかもしれません。

注意:

同値な要素の並び順に依存するコードは書かないようにしましょう。 その並び順がいつまでも同じであるとは限りません。


PHP 7.0.x から PHP 7.1.x への移行
PHP Manual