Open1

PHPバージョンによる違い

PHP7

PHP7の内部実装から学ぶ性能改善テクニック

https://www.slideshare.net/hnw/php7-52408724
  • PHP7は後方互換性は重視されている為PHP5.6からの移行コストは高くはない
  • Zend社のサイトのパフォーマンス比較によれば、約2倍程度のパフォーマンス向上が得られるとのレポートも

PHP5.6からの変更点

  • 非推奨
  • 下位互換性のない変更
    • エラーではなく例外がスローされるようになる(自作のエラーハンドラは呼び出されなくなる)
    • 空のlist()はエラーになる
  • 廃止
    • ereg関数(→preg関数)
    • mysql関数(→mysqli関数・PDO)
  • 新機能
    • ??演算子
    • 無名クラス
    • 関数の返り値に型指定可能に
    • 引数・返り値にスカラー型を指定可能に
  • PHP言語自体の処理構造の変化
    • ASTの導入
    • データ構造を変えて性能改善

PHP8

https://kinsta.com/jp/blog/php-8/
https://recruit.gmo.jp/engineer/jisedai/blog/php8-version-up-notes/
  • PHP7.3からパフォーマンスが最大約1.5倍改善

PHP7.3.xからの変更点

  • 新機能
    • JIT
  • 変更点
    • コンストラクタのプロパティ昇格機能(コンストラクタでプロパティに値を格納するときの記述を短くできる)
    • デフォルト値がnullの場合、その型は暗黙的にnull可能になる
    • traitでabstractメソッドが可能に
    • 複数の異なる型の値を受け入れ(Union型2.0)
    • 内部関数のTypeErrorの一貫性
      • ユーザー定義関数ではTypeErrorが返されていますが、内部関数の動作は複数の条件に応じてそれぞれ異なる
    • パラメータリストの末尾のカンマ許容(パラメータ追加したとき、追加前のパラメータも「,」入れる為変更分になってしまう為か)
    • ::class構文がオブジェクトで使用できるようになる(object::classはget_class(object)と同じ結果を返す)
    • 属性v2(PHP 7.4まで、クラスや関数などの宣言にメタデータを追加する唯一の方法はdoc-commentsでしたが、属性が追加できるようになりました)
    • 名前付き引数(関数に名前付き引数を渡すことができるようになる。渡す順番は関係なし・名前がつくことで分かりやすくなる)
    • null安全オペレータ(最初の演算子がnullと評価されない場合に限り、2 番目の演算子が評価される($a?->b()))
    • 文字列と数値の比較の合理化(0=="foo"だとtrueだったのがfalseに)
    • match式2(switch文は緩やかな比較 (==) だがmatchは厳密な比較(===))
  • 新しい関数
    • str_contains(部分一致文字列検索(返り値がtrue,falseのみ))
    • str_starts_with()およびstr_ends_with()()(はじめとおわりの文字列か判定してtrue,false返す)
    • get_debug_type(gettype 関数と似ているがクラスオブジェクトはクラス名を返す)
  • 下位互換性のない変更
    • アサーションに失敗すると、デフォルトで例外をスロー(設定により無効にもできる)
    • 静的でないメソッドを静的に呼んだ場合エラーになる
    • mktime()とgmmktime()関数は少なくともひとつ引数が必要に(現在のタイムスタンプを取得する目的には、time() )
ログインするとコメントできます