下位互換性のない変更点エラーや例外の取り扱いの変更fatal error や recoverable fatal error の多くが、PHP 7 では例外に変換されるようになりました。 これらの例外は Error クラスを継承したもので、 このクラスは Throwable インターフェイスを実装しています。 この新しいインターフェイスを、すべての例外が実装しています。 エラーではなく例外がスローされるようになるということは、自作のエラーハンドラは呼び出されなくなるということです (Error 例外をキャッチしなかった場合は、fatal エラーが発生します)。 PHP 7 におけるエラーハンドリングの詳細な説明は PHP 7 のエラー を参照ください。 この移行ガイドでは、下位互換性のない変更点を列挙するだけにとどめます。 set_exception_handler が常に Exception オブジェクトを受け取るとは限らないset_exception_handler で登録した例外ハンドラの実装で Exception 型を宣言している場合は、 Error オブジェクトがスローされると fatal エラーが発生します。 PHP 5 と PHP 7 の両方で動くハンドラを書く場合は、ハンドラで型宣言をしてはいけません。 PHP 5 で動いていたコードを移行する際に、そのコードが PHP 7 でだけ動けばいいのなら、 Exception 型で宣言している部分を単純に Throwable 型に置換するだけでかまいません。 内部のコンストラクタは、失敗したときに常に例外をスローする
   これまでは、コンストラクタの処理が失敗した際に、
    パースエラーが発生すると ParseError をスローする
   パースエラーが発生すると ParseError オブジェクトをスローするようになりました。
   eval のエラーハンドリングをする際には、 E_STRICT 通知の深刻度の変更
   すべての  
 
 変数の取り扱いの変更PHP 7 では、抽象構文木を使ってソースファイルをパースするようになりました。 そのおかげで言語としてのさまざまな改良ができるようになりました。 これまでの PHP が使っていたパーサーでは不可能だったこともできるようになったからです。 しかしその結果、一貫性を保つために一部の機能を削除することになりました。 これは、下位互換性を損ねるものです。 このセクションでは、それらについて説明します。 変数やプロパティ、メソッドへの間接的なアクセスの扱いの変更変数やプロパティそしてメソッドへの間接的なアクセスを、厳密に左から右の順で評価するようになりました。 以前のバージョンでは、場合によって評価の順が逆転することもありました。 評価順の変更を、以下の表にまとめます。 
 
 今までのバージョンにおける右から左の評価を想定しているコードは、 波括弧を使って評価順を明示するように (表の中央列のように) 書き直す必要があります。 そうすれば、PHP 7.x との互換性を保ちつつ、PHP 5.x との下位互換性も維持できます。 
   これは、 list の取り扱いの変更list での変数の代入が、逆順ではなくなる
    list における変数への代入が定義された順番どおりに行われるようになりました。
    今までのように逆順にはなりません。
    この変更の影響を受けるのは、list を
     上の例の PHP 5 での出力は、このようになります。 
array(3) {
  [0]=>
  int(3)
  [1]=>
  int(2)
  [2]=>
  int(1)
}
上の例の PHP 7 での出力は、このようになります。 
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
一般論として、 list での代入がどの順で行われるかに依存するコードは書かないことを推奨します。 代入の順番は、実装の都合によって今後も変わる可能性があるからです。 空の list の廃止空の list を作ることはできなくなりました。 次のようなコードは PHP 7 では使えません。 list は文字列を展開しないlist は文字列変数を展開できなくなりました。 かわりに str_split を使いましょう。 参照による代入で自動的に作成した配列要素の並び順の変更参照による代入で配列の要素を自動的に作成した場合の、 要素の並び順が変更されました。 以下に例を示します。 上の例の PHP 5 での出力は、このようになります。 
array(2) {
  ["b"]=>
  &int(1)
  ["a"]=>
  &int(1)
}
上の例の PHP 7 での出力は、このようになります。 
array(2) {
  ["a"]=>
  &int(1)
  ["b"]=>
  &int(1)
}
関数のパラメータを括弧で囲んでもその振る舞いは変わらないPHP 5 では、関数のパラメータを冗長な括弧で囲んでおくと、 関数のパラメータを参照渡しにした場合の警告を抑止することができました。 PHP 7 では、たとえ括弧で囲んでも警告が常に発生します。 上の例の出力は以下となります。 Notice: Only variables should be passed by reference in /tmp/test.php on line 13 
  | 
    
| 開始タグ | 終了タグ | 
|---|---|
<% | 
      %> | 
     
<%= | 
      %> | 
     
<script language="php"> | 
      </script> | 
     
   既に PHP 5.6 で非推奨になっていますが、
   static ではないメソッドに対して非互換のコンテキストで static 呼び出しを行うと、
   呼ばれた側のメソッドが未定義の $this 変数を持つことになって警告が発生します。
  
<?php
class A {
    public function test() { var_dump($this); }
}
// クラスAを継承して「いない」ことに注目
class B {
    public function callNonStaticMethodOfA() { A::test(); }
}
(new B)->callNonStaticMethodOfA();
?>上の例の PHP 5.6 での出力は、このようになります。
Deprecated: Non-static method A::test() should not be called statically, assuming $this from incompatible context in /tmp/test.php on line 8
object(B)#1 (0) {
}
上の例の PHP 7 での出力は、このようになります。
Deprecated: Non-static method A::test() should not be called statically in /tmp/test.php on line 8 Notice: Undefined variable: this in /tmp/test.php on line 3 NULL
yield が右代入演算子に
    yield で括弧が必須ではなくなり、右代入演算子に変わりました。
   優先順位は
   print と => の間になります。
   これによって、以下のように振る舞いが変わります。
  
<?php
echo yield -1;
// 以前はこのように解釈されました
echo (yield) - 1;
// PHP 7 ではこのように解釈されます
echo yield (-1);
yield $foo or die;
// 以前はこのように解釈されました
yield ($foo or die);
// PHP 7 ではこのように解釈されます
(yield $foo) or die;
?>括弧を使えば、曖昧さを排除できます。
   関数内の複数のパラメータを同じ名前にすることができなくなりました。
   たとえば次のようなメソッドは
   E_COMPILE_ERROR となります。
  
<?php
function foo($a, $b, $unused, $unused) {
    //
}
?>func_get_arg, func_get_args, debug_backtrace といった関数や例外時のバックトレースで得られる値が、 パラメータとして渡されたときの値ではなくなりました。 その時点での値が得られるようになります (つまり、パラメータとして渡された値から変更されている可能性があります)。
<?php
function foo($x) {
    $x++;
    var_dump(func_get_arg(0));
}
foo(1);?>上の例の PHP 5 での出力は、このようになります。
1
上の例の PHP 7 での出力は、このようになります。
2
   ひとつの switch 文の中に、複数の default ブロックを定義することができなくなりました。
   たとえば次の switch 文は
   E_COMPILE_ERROR になります。
  
<?php
switch (1) {
    default:
    break;
    default:
    break;
}
?>
   $HTTP_RAW_POST_DATA が使えなくなりました。かわりに
   php://input
   ストリームを使いましょう。
  
# 形式のコメントの削除
   INI ファイルにおいて # で始まる行をコメントとする機能が削除されました。
   かわりに ; を使いましょう。
   この変更は、php.ini だけではなく、
   parse_ini_file や parse_ini_string
   が扱うファイルにもあてはまります。
  
   JSON 拡張モジュールが JSOND に置き換わりました。
   下位互換性を損ねるちょっとした変更が二点あります。
   まず、数値の最後を小数点で終えることができなくなりました (つまり、
   34. とすることはできず、34.0 あるいは
   34 としなければいけません)。
   次に、科学記法を使う際に、指数記号
   e を小数点の直後に置くことができなくなりました
   (つまり、3.e3 とすることはできず、
   3.0e3 あるいは 3e3 としなければいけません)。
   最後に、空の文字列は妥当な JSON だとみなされなくなりました。
  
   これまでのバージョンでは、浮動小数点数値が大きすぎて整数として表せない場合に、
   float から integer に変換した結果を黙って切り詰めていました。
   PHP 7 では E_WARNING が発生し、null を返します。
  
   カスタムセッションハンドラとして実装した関数が
   false あるいは -1 を返すとき、fatal error が発生します。
   この関数が boolean 値か -1, あるいは
   0 以外を返す場合は、その関数は失敗して E_WARNING が発生します。
  
内部的なソートアルゴリズムが改良されたことに伴って、 比較したときに等しいとみなされる要素の並び順が以前とは変わるかもしれません。
注意:
同値な要素の並び順に依存するコードは書かないようにしましょう。 その並び順がいつまでも同じであるとは限りません。
   ループまたは switch 制御構造の外の
   break および continue 文は、 
   以前のように実行時ではなくコンパイル時に検出され、
   E_COMPILE_ERROR を起こします。
  
   break と continue
   文は定数を引数として渡せなくなりました。
   渡すと、
   E_COMPILE_ERROR が発生します。
  
Mhash 拡張は Hash 拡張に完全に統合されました。 したがって、extension_loaded で Mhash サポートを検出できなくなりました。 代わりに function_exists を使用してください。 さらに、Mhash は get_loaded_extensions および関連機能により報告されなくなりました。
declare(ticks) ディレクティブは、異なるコンパイル単位にリークしなくなりました。