PHP7の現状

(Last Updated On: 2018年8月13日)

PHP7が今年の秋リリースされる予定です。まだまだ多くの変更が行われる予定ですが、現状を簡単にまとめてみたいと思います。代表的な物のみ取り上げています。

ご存知ない方の為に書いておきます。現在リリースされているPHPはPHP5です。次のPHPはPHP7になり、PHP6はリリースされません。PHP6をUnicodeをネイティブ文字列としてサポートするバージョンとして開発されましたが、文字エンコーディングチェックを内部で自動的に行おうとするなど、無駄が多く遅いため破棄されました。(文字エンコーディングのバリデーションは本来アプリでするものです)このため、PHP6はスキップされ次のPHPはPHP7になります。

追記:PHP7.0は既にリリースされています。概要はPHP 7.0の概要・新機能・互換性、詳しくはマイグレーションドキュメントをご覧ください。

PHP7の変更点

最も大きな変更はZendエンジンです。Zendエンジンはバージョン2からバージョン3になります。パフォーマンスが大幅に向上しています。Zendエンジンへの変更はPHPプログラマへの影響はあまりありません。C/C++でモジュールを作成するプログラマには大きな影響があります。

PHP7のリリースは10月頃を予定しています。

 

Zendエンジンの拡張/変更

  • 内部データ構造変更によるパフォーマンス向上 – PHP変数を保存するzvalが大幅に変更されました。当初JITによる性能向上が試みられましたが、実装の結果データ構造の見直しの方が効果的と結論がでました。同時にZend APIも変更されました。多少の慣れが必要ですが、以前に比べプログラミングしやすくなっています。
  • コンパイラの変更 – コンパイラが変更されAST(Abstruct Syntax Tree)が導入されました。これにより言語仕様の変更が容易に行えるようになりました。https://github.com/nikic/php-astのようなツールも既に開発されています。
    https://wiki.php.net/rfc/abstract_syntax_tree
  • 文字列の変更 – 元々PHPの変数はコピーオンライト(コピーに変更があった場合にのみ新しい変数を作成)でした。しかし、モジュール内ではC言語の文字列型が利用されていました。zend_string型が導入されモジュール内でも利用されています。zend_string型は文字列をハッシュし、コピーオンライトで利用することも可能になっています。
  • モジュールへの影響 – 今のところモジュールAPIに大きな変更はありませんが、Zend APIの大幅な変更、zend_string型が導入のため既存モジュールはPHP7に対応しないとコンパイルできません。
  • ネイティブスレッド対応 – PHPがマルチスレッドプログラミングに対応するのではありません。マルチスレッドWebサーバーで利用されてるZTS(Zend Thread Safty)モードがネイティブスレッドに対応しました。これによりTSRM(Thread Safe Resource Manager)マクロを利用する必要がなくなりました。
    https://wiki.php.net/rfc/native-tls

まだ完全とは言えませんが、Zendエンジンへの変更は以下のURLから参照できます。

 

言語仕様の拡張/変更

  • 関数/メソッドの戻り値のタイプヒント – Hackと同様のタイプヒントが追加され function Foo() : TypeName {} のように戻り値にタイプヒントが利用できます。
    https://wiki.php.net/rfc/return_types
  • ??オペレーターの追加 – $str ?? ‘default’ は isset($str) ? $str : ‘default’ と同等です。 3項演算子のショートカット “?:” と似ていますが未定義変数でエラーが発生しません。
    https://wiki.php.net/rfc/isset_ternary
  • PHPタグの削除 – 埋め込みPHPスクリプトの開始/終了を宣言する、ASPタグ(<%)とLanguageタグ(<script language=php>)が削除されました。
    https://wiki.php.net/rfc/remove_alternative_php_tags
  • 間接参照順序 – PHP7以前は()を使った間接参照の順序が場合によって異なりました。PHP7以降は左から右へと参照するように統一されました。
    https://wiki.php.net/rfc/uniform_variable_syntax#semantic_differences_in_existing_syntax
  • 不正な8進数 – PHP7以降は不正な8進数リテラルはエラーになります。
  • 不正な$thisの利用 – PHP7はスタティックコンテクストからの不正な$this参照ができなくなります。
    https://wiki.php.net/rfc/incompat_ctx
  • Unicodeエスケープ – Unicodeのコードポイントを直接リテラル/文字列変数に書き込める(”\u{code point}”)ようになりました。この為、”\u{無効なcode point”はエラーとなります。
    https://wiki.php.net/rfc/unicode_escape
  • 整数の取り扱い厳格化 – 未定義だった動作が統一化され、不正な操作の動作でエラーまたは0になります。
    https://wiki.php.net/rfc/integer_semantics
  • 64bit サポート ー 64bit環境では最大64bitの文字列の長さ、配列に符号付き64bit整数キーがサポートされます。Windows環境はLLP64だったので64bit環境でも整数が32bitに制限されていましたが、64bitになります。
    https://wiki.php.net/rfc/size_t_and_int64_next
  • php.iniの整理 – mbstring.http_input/internal_encoding/http_output、iconv.input_encoding/internal_encoding/output_encodingが廃止され、グローバル設定のinput_encoding/internal_encoding/output_encodingに統合されます。(これは私が作業予定)

 

モジュールの拡張/変更

  • Sessionモジュールの高速化 – セーブハンドラが拡張され、update_timestamp()関数/updateTimestampメソッドが追加されました。これによりセッションジュールは書き込みが必要な場合にのみ書き込みを実行します。$_SESSIONに変更が無い場合の性能が大幅に向上します。(私の変更です。PHP 5.6に入れるハズでしたがマージできず入りませんでした。期待していた方、申し訳ないです。)
    https://wiki.php.net/rfc/session-lock-ini
  • 古いコードの削除 – mysql、regex、mcryptモジュールなどの古いモジュール、メンテナンスされていないライブラリを利用しているモジュールはソース配布版PHPから削除されます。古いWeb SAPI(例えば、aol server)が削除されます。(議論中ですがほぼ確実です)
    https://wiki.php.net/rfc/removal_of_dead_sapis_and_exts
  • JSONライブラリの変更 – JSONモジュールが利用するライブラリがjsondに変更されます。(投票中ですがほぼ確実です)
    https://wiki.php.net/rfc/jsond

 

検討中の拡張/変更

  • ネイティブUnicodeサポート
  • pecl_httpモジュールの追加

その他のアイデアは以下のURLに記載されています。

 

まとめ

大きな変更はRFCが作成され記載されています。この他、今迄は互換性の為にバグ修正が行えなかった問題なども修正されています。

既存のPHPユーザーとして重要な決定に、PHP 5.7はリリースしない、ことがあります。つまりPHP5のサポートが3年後には無くなることを意味します。PHP7には大きな変更が行われていますが、PHP5と高い互換性を保っています。メジャーバージョンアップだからしばらく様子を見よう、と考えている時間はあまりありません。

参考

 

投稿者: yohgaki