アップグレードドキュメントへのリンクは、セブンの非互換性を説明するWebサイトのニューステキストで公開されています。 廃止された機能と拡張機能に加えて、通常どおり(SAPIモジュールの大部分が消えた)、言語自体に顕著な変化が生じました。 以下はその一部です。
公式文書から順に:
変数処理の変更
1.変数、プロパティ、およびメソッドへの間接参照は、左から右に解析されるようになりました。 中括弧で前の順序を復元できます。
$$foo['bar']['baz'] // ($$foo)['bar']['baz'] - ${$foo['bar']['baz']} $foo->$bar['baz'] // ($foo->$bar)['baz'] - $foo->{$bar['baz']} $foo->$bar['baz']() // ($foo->$bar)['baz']() - $foo->{$bar['baz']}() Foo::$bar['baz']() // (Foo::$bar)['baz']() - Foo::{$bar['baz']}()
2. globalキーワードは、単純な変数のみを受け入れます。 グローバル$$ foo-> barの代わりに、 グローバル $ {$ foo-> bar}を書く必要があります
3.変数または関数呼び出しを囲む中括弧は、動作に影響しなくなりました。 たとえば、関数の結果が参照によって渡されるコード:
function getArray() { return [1, 2, 3]; } $last = array_pop(getArray()); // Strict Standards: Only variables should be passed by reference $last = array_pop((getArray())); // Strict Standards: Only variables should be passed by reference
括弧に関係なく、厳密な標準エラーがスローされるようになりました(以前は2回目の呼び出しではなかった)。
4.参照による割り当て中に自動的に作成された配列要素またはオブジェクトプロパティの順序が変わります。 コード:
$array = []; $array["a"] =& $array["b"]; $array["b"] = 1; var_dump($array);
これで、配列["a" => 1、 "b" => 1]が生成されますが、以前は["b" => 1、 "a" => 1]でした。
リスト()処理の変更
1. list()は、変数を直接の順序で(以前は逆に)割り当てるようになりました。次に例を示します。
list($array[], $array[], $array[]) = [1, 2, 3]; var_dump($array);
現在、[3、2、1]の代わりに$ array == [1、2、3]を返します。 割り当て順序のみが変更されています。 リスト()の通常の使用は影響を受けません。
2.空のリスト()を持つ割り当てが禁止されているため、次の式は誤りです。
list() = $a; list(,,) = $a; list($x, list(), $y) = $a;
3. list()は文字列の展開をサポートしなくなりました(以前は一部のケースでサポートされていました)。 コード:
$string = "xy"; list($x, $y) = $string;
$ xと$ yを$ x ==“ x”と$ y ==“ y”ではなくnull(警告なし)に設定します。 さらに、list()は、ArrayAccessインターフェースを実装するオブジェクト、つまり これがどのように機能するかです:
list($a, $b) = (object) new ArrayObject([0, 1]);
以前は、両方の変数がnullでした。
Foreachの変更
1. foreach()の繰り返しは、現在の()/ next()/ ...関数ファミリーを介してアクセス可能な配列の内部ポインターに影響を与えなくなりました
$array = [0, 1, 2]; foreach ($array as &$val) { var_dump(current($array)); }
これで、int(0)を3回印刷します。 以前-int(1)、int(2)、bool(false)
2. 値による配列の反復中に、foreachは配列のコピーを使用するようになり、ループ内での変更はループの動作に影響しません。
$array = [0, 1, 2]; $ref =& $array; // , foreach ($array as $val) { var_dump($val); unset($array[1]); }
コードはすべての値(0 1 2)を出力します。以前は2番目の要素がスローされました-(0 2)。
3.配列が参照によって反復される場合、配列への変更はループに影響します。 PHPは、たとえば配列の最後に追加するなど、多くの場合によりうまく機能すると想定されています。
$array = [0]; foreach ($array as &$val) { var_dump($val); $array[1] = 1; }
繰り返し、追加されたアイテム。 出力は「int(0)int(1)」となり、以前は「int(0)」のみでした。
4.値または参照による通常の(Traversableではない)オブジェクトの反復は、配列の参照による反復のように動作します。 以前-同様に、前の段落のより正確な配置を除きます。
5. Traversableオブジェクトの反復は変更されていません。
関数の引数処理の変更
1.引数に同じ名前を使用することはできなくなりました(コンパイルエラーが発生します)。
public function foo($a, $b, $unused, $unused) { // ... }
2. Func_get_arg()およびfunc_get_args()関数は現在の値を返します(元の値ではありません)。 例:
function foo($x) { $x++; var_dump(func_get_arg(0)); } foo(1);
「1」ではなく「2」を出力します。
3.同様に、例外のトレースは元の値を表示しませんが、すでに変更されています。
function foo($x) { $x = 42; throw new Exception; } foo("string");
以下を生成します:
Stack trace:
#0 file.php(4): foo(42)
#1 {main}
以前は、次のようになりました。
Stack trace:
#0 file.php(4): foo('string')
#1 {main}
これは実行には影響しませんが、デバッグ時にはこれを念頭に置いてください。 同じ制限がdebug_backtrace()および引数を調べる他の関数にあります。
整数処理の変更
1. 8進数が正しくないと、コンパイルエラーが発生します。
$i = 0781; // 8 -
以前は、誤った放電後のすべてが破棄され、$ iには7がありました。
2.負の数によるビット単位のシフトがArithmeticErrorをスローするようになりました。
var_dump(1 >> -1); // ArithmeticError: Bit shift by negative number
3.桁数よりも大きい数だけ左にシフトすると、0が返されます。
var_dump(1 << 64); // int(0)
以前は、動作はアーキテクチャに依存していました。x86およびx86-64では、結果は== 1でした。 シフトは周期的でした。
4.同様に、右にシフトすると0または-1(符号に応じて)が得られます。
var_dump(1 >> 64); // int(0) var_dump(-1 >> 64); // int(-1)
エラー処理の変更
1. 16進数の行番号に解析されなくなりました。
var_dump("0x123" == "291"); // bool(false) ( true) var_dump(is_numeric("0x123")); // bool(false) ( true) var_dump("0xe" + "0x1"); // int(0) ( 16) var_dump(substr("foo", "0x1")); // string(3) "foo" ( "oo") // Notice: A non well formed numeric value encountered
filter_var()を使用して、16進数の内容の文字列を確認したり、通常の数値に変換したりできます。
$str = "0xffff"; $int = filter_var($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX); if (false === $int) { throw new Exception("Invalid integer!"); } var_dump($int); // int(65535)
2. Unicodeのエスケープ構文が追加されているため、二重引用符で囲まれた文字列とheredocはこれを考慮に入れる必要があります。
$str = "\u{xyz}"; // Fatal error: Invalid UTF-8 codepoint escape sequence
ダブルスラッシュのエスケープが必要:
$str = "\\u{xyz}";
ただし、後続の{のない単純な「\ u」は影響を受けないため、変更なしで機能します。
$str = "\u202e";
すでにここに記述されている新しいエラー処理については、繰り返しません。 興味深いことに、組み込みのクラスコンストラクターは常に例外をスローするようになりましたが、以前は単純にnullを返していました。
他の変更のうち、ドキュメントでは、静的に呼び出される非静的メソッドに対して$ thisが存在しないことに注意するようになりました(以前は、メソッドは呼び出しコンテキストで$ thisを使用していました)。
論理リストは補充され、クラス、特性、および名前インターフェースにはアクセスできません-bool、int、float、string、null、false、trueが追加され、将来の使用のためにリソース、オブジェクト、混合、数値が追加されます。
yieldコンストラクトは、式で使用する場合、それ以上の括弧を必要としません。 これは、「print」と「=>」の間の優先度を持つ右結合演算子です。 したがって、動作が変更される場合があります。
echo yield -1; // echo (yield) - 1; // echo yield (-1);
yield $foo or die; // yield ($foo or die); // (yield $foo) or die;
これらのケースは、括弧で強制的に指定することをお勧めします。
関数の標準ライブラリの顕著な変更のうち、call_user_method()およびcall_user_method_array()の削除のみに注意し、残りはそれほど重要ではありません(php-fpmでdl()を投げ、名前を変更して最適化したzend_qsort-> zend_sort、追加zend_insert_sort、setcookieの動作を少し変更しましたCookieを削除し、バッファリング内の致命的なob_startエラーを削除しました)。