静的プロパティの非対称な可視性
PHP 8.5では、プロパティの非対称な可視性の指定が、静的プロパティに対しても可能になりました。
プロパティの非対称な可視性とは、PHP 8.4で導入された、プロパティの読み取りと書き込みのそれぞれについて、別個に可視性を指定できるようにする構文です(第5回の「非対称可視性」を参照)。従来は、非対称な可視性の指定は、静的プロパティについては使用できませんでした。
PHP 8.5でこの制約がなくなり、以下のリストのように、静的プロパティを読み取りはpublicで書き込みはprivateでと設定できます。
class MyClass
{
public private(set) static string $title = 'My Class';
}
print MyClass::$title . PHP_EOL; // 読み取りはOK
MyClass::$title = 'New Title'; // 書き換えは不可
// Fatal error: Uncaught Error: Cannot modify private(set) property MyClass::$title from global scope
NoDiscardアトリビュート
PHP 8.5では、NoDiscardアトリビュートを関数定義に対して指定できるようになりました。これにより、戻り値を破棄できない関数の定義が可能になり、戻り値を正しく処理しないことによる不具合を防止できます。
#[\NoDiscard]
function func(int $x) {
return $x;
}
func(100);
// Warning: The return value of function func() should either be used or intentionally ignored by casting it as (void)
$ret = func(200); // 受け取りさえすればOK
戻り値は受け取ればよく、それを使わないで済ませてしまったとしても問題ありません。
定数式内のクロージャ
PHP 8.5では、定数式にクロージャを記述できるようになりました。正確には、アトリビュートの引数、プロパティの既定値、引数の既定値、そして定数そのものに、staticなクロージャと第一級callableを記述できます。
以下のリストは、関数の引数の既定値として、staticなクロージャを指定する例です。
function number_filter(
array $array,
Closure $callback = static function ($c) {
return !ctype_digit($c);
}) {
$result = [];
foreach ($array as $c) {
if ($callback($c)) {
$result[] = $c;
}
}
return $result;
}
var_dump(number_filter([
'0', 'a', '1', '2', 'b', '3',
'c', '5', 'z', '8', '9'
]));
// "a", "b", "c", "z"
トレイトへのDeprecatedアトリビュート
PHP 8.5では、トレイト定義にDeprecatedアトリビュートを指定できるようになりました。これにより、非推奨のトレイトをクラスに実装しようとした場合に、警告を発生させることができます。
#[\Deprecated]
trait MyTrait {}
class MyClass {
use MyTrait;
}
// Deprecated: Trait MyTrait used by MyClass is deprecated
FILTER_THROW_ON_FAILURE
PHP 8.5では、filter_varなどの関数にオプションFILTER_THROW_ON_FAILUREを指定できるようになりました。これにより、検証失敗時にエラーとすることができます。従来は、オプションなしでfalse、オプションFILTER_NULL_ON_FAILUREでnullが返ってきましたが、これにエラーという選択肢が加わるわけです。
以下のリストは、'alpha'などがFILTER_VALIDATE_BOOLEANすなわち論理値であるかどうか検証する例です。
filter_var('alpha', FILTER_VALIDATE_BOOLEAN);
filter_var('beta', FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
filter_var('ganma', FILTER_VALIDATE_BOOLEAN, FILTER_THROW_ON_FAILURE);
// Fatal error: Uncaught Filter\FilterFailedException: filter validation failed: filter boolean not satisfied by 'ganma'
[NOTE]filter_var関数
filter_var関数は、さまざまなタイプのデータの検証の機能を提供します。第1引数の値が第2引数で指定するフィルターを満たすか検証し、合格すれば値をそのまま返し、そうでない場合はオプションの指定でfalseやnullを返します。フィルターには、メールアドレスやURLなどの比較的複雑なパターンの検証も指定できます。
プロパティのOverrideアトリビュート
PHP 8.5では、プロパティについてもOverrideアトリビュートが指定できるようになりました(Overrideアトリビュートについては第3回の「Overrideアトリビュートによるオーバーライドメソッドの明示」を参照)。従来はメソッドについてのみ指定できましたが、抽象クラスでプロパティがサポートされたことなどを受けて、オーバーライドの指定の必要性が出たためです。
abstract class MyClass { // 抽象クラスとする
abstract public mixed $prop { get; } // 抽象プロパティとする
}
class YourClass extends MyClass {
#[\Override]
public mixed $prop {
get { // ゲッターのオーバーライド
return 'This is overridden property.';
}
}
}
privateなプロパティには指定できないのは、メソッドと同様です。また、オーバーライドにならない場合に指定してもエラーとなります。
まとめ
今回は、PHP 8.5における言語仕様の強化ポイントを紹介しました。次回は、関数と処理系の強化ポイントを紹介します。
