言語仕様での機能強化と変更
続けて、言語仕様における機能強化と変更について紹介します。
非推奨属性(#[\Deprecated])
PHP 8.4では、ユーザ定義の関数、メソッド、クラス定数について、それが廃止対象であることを明示できるようになりました。非推奨としたい関数などの定義の前に#[\Deprecated]属性を置くことで、非推奨としてマークされます。
#[\Deprecated] // 非推奨をマーク
function d_func() {
return 'この関数は廃止されました';
}
#[\Deprecated("Use newfunc() instead", since: "3.1")] // メッセージ付き
function d_func2() {
return 'この関数も3.1で廃止されました';
}
print d_func() . "\n"; // Deprecated: Function d_func() is deprecated
print d_func2() . "\n"; // Deprecated: Function d_func2() is deprecated since 3.1, Use newfunc() instead
このように、関数などを非推奨にマークできるほか、バージョンの明記や追加メッセージも指定できます。
newからのカッコなしのメソッドチェーン
PHP 8.4では、newによるインスタンス化からすぐにメソッドチェーンでメソッドを呼び出したい場合、優先順位を明示するカッコが不要になりました。従来は、以下のようにカッコで囲って優先順位を明示する必要がありました。
print (new Ramen())->serve() . "\n"; // < PHP 8.4
newを使う場合、優先順位の解釈に曖昧さは生じないため、PHP 8.4ではこのカッコが以下の通り不要になりました。
print new Ramen()->serve() . "\n"; // PHP 8.4
カッコが重なると見にくいですし、微々ながらもタイプ量も増えますから、細かな改良ですがうれしいですね。
暗黙のnullable型の非推奨化
PHP 8.4では、関数の引数に型が指定されている場合、デフォルト値としてnullを指定すること(暗黙のnullable型)が非推奨となりました。従来は、こういったケースではnullの代入も可能でした。これを正して、型が指定されている場合にはnullをデフォルト値として設定することは非推奨となります。
function func(int $a = null) { // 特に警告なし(< PHP 8.4)
}
// Deprecated: func(): Implicitly marking parameter $a as nullable is deprecated, the explicit nullable type must be used instead (PHP 8.4)
PHP 8.4では、このように暗黙のnullable型は非推奨となり、明示的なnullable型(この場合は?int)が必要と警告されます。PHP 9.0では完全にエラーとなる予定です。
0のマイナス乗の動作変更
PHP 8.4では、0を負数でべき乗したときにエラーになります。従来は、無限大(float(INF))が演算結果となっていました。負数によるべき乗は、実際には以下のような演算になります(**はべき乗の演算子です)。つまり、逆数をとって、絶対値によるべき乗になります。
x ** -y ➡ 1/x ** y
xが0の場合、1/xは除算エラーになるので、この時点でゼロ除算エラーとするのが今回の変更です。演算結果としては従来通りfloat(INF)が返りますが、Deprecatedのエラーとなります。
var_dump(0 ** -1); // float(INF) // Deprecated: Power of base 0 and negative exponent is deprecated (PHP 8.4)
なお、PHP 9.0では完全にDivisionByZeroErrorエラーとすることになっています。
