新機能
スカラー型宣言
スカラー
型宣言
には二つの方式があります。デフォルトの自動変換(coercive) モードと、
厳密に判断する strict モードです。
パラメータとして、
文字列 (string)、整数 (int
)、浮動小数点数
(float)、boolean (bool
)
といった型をいずれかの方式で強制できるようになりました。
これらは、PHP 5 で導入された型宣言 (クラス名やインターフェイス、配列そして callable)
を強化するものです。
strict モードを有効にするには、ファイルの先頭に declare
ディレクティブを置く必要があります。
つまり、スカラー型を厳密に扱うかどうかは、ファイル単位で定めるということです。
このディレクティブは、パラメータの型宣言だけでなく、関数の戻り値の型
(戻り値の型宣言を参照ください)
や PHP の標準関数、そして拡張モジュールの関数にも影響を及ぼします。
スカラー型宣言に関するドキュメントやサンプルについては、
型宣言
を参照ください。
戻り値の型宣言
PHP 7 では、
戻り値の型宣言
もできるようになりました。
引数の型宣言
と同様に、戻り値の型宣言では、関数が戻す値がどの型になるかを宣言します。
戻り値の型宣言で使える
型
は、引数の型宣言で使えるものと同じです。
詳細なドキュメントやサンプルについては、
戻り値の型宣言.
を参照ください。
Null 合体演算子
null 合体演算子 (??
) がシンタックスシュガーとして追加されました。
三項演算子と isset() を組み合わせる
よくありがちなパターンを、より簡単に書くためのものです。
この演算子は、もし第一オペランドが非 null
の値であればそれを返し、
そうでない場合は第二オペランドを返します。
宇宙船演算子
宇宙船演算子は、二つの式を比較するために使うものです。
$a が $b より大きい場合は 1、
$a と $b が等しい場合は 0、
$a が $b より小さい場合は -1 をそれぞれ返します。
比較の際には、
PHP 型の比較表
のルールを用います。
define() で配列の定数を定義できるようになりました。
PHP 5.6 までのバージョンでは、配列の定数は const
でしか定義できませんでした。
無名クラス
無名クラスをサポートするようになりました。new
class
を使って利用します。
その場限りの使い捨てのオブジェクトなどで、完全なクラス定義のかわりとして使えます。
詳細なドキュメントは
無名クラス
を参照ください。
Unicode コードポイントエスケープ構文
Unicode のコードポイントを十六進形式で受け取って、
それを UTF-8 で (ダブルクォートで囲まれた文字列あるいはヒアドキュメントとして) 出力します。
妥当な形式のコードポイントならあらゆるものが使えます。先頭のゼロは省略してもかまいません。
この仕組みは、信頼できないデータからオブジェクトを復元する際に、
よりセキュリティを高められるようにするために用意されたものです。
アンシリアライズ可能なクラスの一覧をホワイトリストとして定義することで、
コードインジェクション攻撃を防ぎます。
ICU のさらなる機能を利用するために、新しく IntlChar
クラスが追加されました。このクラスには数々の static メソッドと定数が定義されており、
これらを使って Unicode の文字を操作できます。
このクラスを使うには、Intl 拡張モジュールをインストールしなければいけません。
Expectation
Expectations は、かつての
assert() 関数を、下位互換性を保ったまま拡張したものです。
これを用いると、コストをかけずに実運用コードの中にアサーションを組み込めます。
そして、アサーションが失敗した際に自作の例外をスローできるようになります。
これまでの API も下位互換性を保つために維持されていますが、
assert() は言語構造となりました。
最初のパラメータには、単に評価対象の文字列や bool
値を指定するだけではなく、式を渡せます。
開発環境および運用環境での設定方法などの詳細については、
言語構造 assert() のマニュアルを参照ください。
use
宣言のグループ化
複数のクラスや関数そして定数を同じ namespace
からインポートする際に、
単一の use
文にまとめられるようになりました。
ジェネレータでの return
PHP 5.5 で導入されたジェネレータの機能拡張です。
ジェネレータの内部で return
文が使えるようになりました。
これを使えば、ジェネレータが最終的に返す式を指定できます (参照を返すことはできません)。
この値を取得するには、新しいメソッド
Generator::getReturn()
を用います。
このメソッドを使うのは、ジェネレータが値の生成を終えた後の一度だけになるでしょう。
ジェネレータの最終値を明示的に返せる機能は、あれば便利なものです。
ジェネレータを実行したクライアント側のコードが、
ジェネレータが最後に返す値 (何らかのコルーチンの計算結果) を特別扱いできるようになるからです。
「取得した値が最後の値かどうかをまず調べて、最後であれば特別扱いする」
という処理をクライアント側で書くよりは、ずっとシンプルになります。
ジェネレータの委譲
ジェネレータを、別のジェネレータや
Traversable オブジェクトそして配列に委譲できるようになりました。
外側のジェネレータに決まり文句を書いたりする必要はなく、単に yield from
構文を使うだけです。
新しい intdiv() 関数は、
オペランドに対して整数の除算を行い、その結果を返します。
これまでのバージョンでは、ArrayAccess
を実装したオブジェクトに対して list() が正常に機能しないことがありました。
PHP 7 ではこの問題が修正されました。
その他の機能
-
クローンしたクラスのメンバーにアクセスできるようになりました。
(clone $foo)->bar()
のようにできるということです。