SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ますます便利になるPHPの新機能を探ろう!

より使いやすくなったPHP 8.5の新機能──パイプライン演算子や新しいアトリビュートなど言語仕様の強化ポイント

ますます便利になるPHPの新機能を探ろう! 第7回

静的プロパティの非対称な可視性

 PHP 8.5では、プロパティの非対称な可視性の指定が、静的プロパティに対しても可能になりました。

 プロパティの非対称な可視性とは、PHP 8.4で導入された、プロパティの読み取りと書き込みのそれぞれについて、別個に可視性を指定できるようにする構文です(第5回の「非対称可視性」を参照)。従来は、非対称な可視性の指定は、静的プロパティについては使用できませんでした。

 PHP 8.5でこの制約がなくなり、以下のリストのように、静的プロパティを読み取りはpublicで書き込みはprivateでと設定できます。

リスト static_property.php
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アトリビュートを関数定義に対して指定できるようになりました。これにより、戻り値を破棄できない関数の定義が可能になり、戻り値を正しく処理しないことによる不具合を防止できます。

リスト no_discard.php
#[\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なクロージャを指定する例です。

リスト constant_attribute.php
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アトリビュートを指定できるようになりました。これにより、非推奨のトレイトをクラスに実装しようとした場合に、警告を発生させることができます。

リスト trait_deprecated.php
#[\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すなわち論理値であるかどうか検証する例です。

リスト trait_deprecated.php
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アトリビュートによるオーバーライドメソッドの明示」を参照)。従来はメソッドについてのみ指定できましたが、抽象クラスでプロパティがサポートされたことなどを受けて、オーバーライドの指定の必要性が出たためです。

リスト override_property.php
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における言語仕様の強化ポイントを紹介しました。次回は、関数と処理系の強化ポイントを紹介します。

この記事は参考になりましたか?

ますます便利になるPHPの新機能を探ろう!連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/22819 2025/12/24 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング