これまでのバージョンでは、ユーザー定義の関数に渡す引数が足りない場合は 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_srand()
の結果に依存するコードを書いていた場合は、mt_srand()
のオプションの第二引数に MT_RAND_PHP
を指定すると、これまでの挙動 (間違った実装) を維持できます。
rand() と srand() は、それぞれ mt_rand() と mt_srand() のエイリアスになりました。つまり、 rand()、shuffle()、 str_shuffle()、array_rand() の出力がこれまでのバージョンとは変わるということです。
ASCII 制御文字 delete (0x7F) は、 クォートしない限りは識別子として使えなくなりました。
error_log
に syslog を指定した場合の変更
INI 項目 error_log
の設定値を
syslog にした場合に、PHP のエラーレベルが syslog
のエラーレベルにマッピングされるようになりました。
これまでのバージョンではすべてのエラーが notice レベルで記録されていましたが、
この変更によって、今までよりも細やかな区別ができるようになります。
オブジェクトのコンストラクタの実行中に例外がスローされた場合に、 そのオブジェクトのデストラクタが呼ばれることはなくなりました。 以前のバージョンでは、場合によっては (例: そのオブジェクトが例外バックトレースなどで外部から参照される場合) デストラクタが呼ばれることもありました。
引数を参照渡しで受け取る関数を call_user_func() から呼んだときに、例外が発生するようになりました。 以前のバージョンでは、完全修飾形式の呼び出しであるか否かによってこの場合の挙動が異なっていました。
さらにこの場合、call_user_func() や call_user_func_array() は関数呼び出しを中断しなくなりました。 "expected reference" という警告は出すものの、処理自体はそのまま続行します。
文字列に空のインデックス演算子を適用する (例: $str[] = $x) と、fatal エラーが発生します。これまでのバージョンではエラーにならず、 ただ配列に変換されるだけでした。
以下の INI 項目は、削除されました。
session.entropy_file
session.entropy_length
session.hash_function
session.hash_bits_per_character
参照による代入で配列の要素が自動的に作られる場合に、その並び順が変更されました。
<?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) }
内部的なソートアルゴリズムが改良されたことに伴って、 比較したときに等しいとみなされる要素の並び順が以前とは変わるかもしれません。
注意:
同値な要素の並び順に依存するコードは書かないようにしましょう。 その並び順がいつまでも同じであるとは限りません。