Slide 1

Slide 1 text

第167回 PHP勉強会@東京 2024/08/28 @02 PHP RFC: Deprecate implicitly nullable parameter types をサクッと話す

Slide 2

Slide 2 text

© 2012-2024 BASE, Inc. #phpstudy BASE, Inc. BASE BANK 出金Devチーム Engineering Program Manager / フルサイクルエンジニア PHPカンファレンス2024 実行委員長 2024/12/22(日)開催デス! 02 大津 和槻(おおつ かずき) :@cocoeyes02 自己紹介

Slide 3

Slide 3 text

© 2012-2024 BASE, Inc. #phpstudy 時間切れが怖いので募集なう! バックエンド エンジニア SRE フロントエンド エンジニア セキュリティ エンジニア QA エンジニア データ エンジニア etc… We are hiring! https://binc.jp/jobs

Slide 4

Slide 4 text

© 2012-2024 BASE, Inc. #phpstudy 今回話すRFC 4 https://wiki.php.net/rfc/deprecate-implicitly-nullable-types

Slide 5

Slide 5 text

RFCの概要

Slide 6

Slide 6 text

© 2012-2024 BASE, Inc. #phpstudy RFCの概要 6 Deprecate implicitly nullable parameter types 意訳「引数の型指定のうち、暗黙的な null 許容を非推奨にする」 // 8.3以前 function foo(int $var = null) {...} // OK // 8.4 // Deprecated: Implicitly marking parameter $var as nullable is deprecated, the explicit nullable type must be used instead function foo(int $var = null) {...}

Slide 7

Slide 7 text

© 2012-2024 BASE, Inc. #phpstudy RFCの概要 7 PHP8.4でdeprecated、PHP9.0でエラーになります。 8.4以上はnullableかunion型を使って、明示的にnullableを表現しましょう // NG function foo(int $var = null) {...} // OK function foo(?int $var = null){...} function foo(int|null $var = null) {...}

Slide 8

Slide 8 text

© 2012-2024 BASE, Inc. #phpstudy RFCの概要 8 PHP-CS-Fixer や PHP_CodeSniffer でも対応できそう ● PHP-CS-Fixer ○ nullable_type_declaration_for_default_null_value ● PHP_CodeSniffer ○ SlevomatCodingStandard.TypeHints.NullableTypeForNullDefaultValue

Slide 9

Slide 9 text

なぜnullableじゃない型に nullが?

Slide 10

Slide 10 text

© 2012-2024 BASE, Inc. #phpstudy なぜnullableじゃない型にnullが? 10 ● PHP5.1 ○ 引数のデフォルト値にnullを代入できる ○ array の型指定ができる ● PHP5.4 ○ callable の型指定できる ● PHP7.0 ○ スカラー型(int, float, string, bool)の型指定ができる ● PHP7.1 ○ 引数や戻り値でのnullable指定できる(?T構文)

Slide 11

Slide 11 text

© 2012-2024 BASE, Inc. #phpstudy なぜnullableじゃない型にnullが? 11 ● PHP5.1 ○ 引数のデフォルト値にnullを代入できる ○ array の型指定ができる ● PHP5.4 ○ callable の型指定できる ● PHP7.0 ○ スカラー型(int, float, string, bool)の型指定ができる ● PHP7.1 ○ 引数や戻り値でのnullable指定できる(?T構文) nullableの構文がないから、型に関係なく デフォルト値にnullを使用できるように nullableを型で表現できるように

Slide 12

Slide 12 text

© 2012-2024 BASE, Inc. #phpstudy なぜnullableじゃない型にnullが? 12 ● PHP5.1 ○ 引数のデフォルト値にnullを代入できる ○ array の型指定ができる ● PHP5.4 ○ callable の型指定できる ● PHP7.0 ○ スカラー型(int, float, string, bool)の型指定ができる ● PHP7.1 ○ 引数や戻り値でのnullable指定できる(?T構文) PHP7.1でnullable指定出来ても、引き続き引数のデフォルト値にnullを代入できる →前提の違いによって、言語のルールに矛盾が生じてしまった nullableの構文がないから、型に関係なく デフォルト値にnullを使用できるように nullableを型で表現できるように

Slide 13

Slide 13 text

© 2012-2024 BASE, Inc. #phpstudy なぜnullableじゃない型にnullが? 13 そして他のバグも誘発・・・次のメジャーバージョンPHP9.0に目を向けたRFCだった ● PHP8.0 ○ デフォルト値を設定した引数の後に、デフォルト値のない引数を定義すると Deprecatedに ○ ex. ○ ただしnullは除く(後方互換性のため) ● PHP8.1 ○ 引数や戻り値でのnullable指定(?T構文)の場合、上記のDeprecatedが発行 されなかったので修正 ● PHP8.3 ○ union型(T|null)の場合、上記のDeprecatedが発行されなかったので修正 function foo(int $var = null, string $var) {...}

Slide 14

Slide 14 text

© 2012-2024 BASE, Inc. #phpstudy まとめ 14 ● 型でnullableを表現しない状態でデフォルト値にnullを代入ができなくなる ○ PHP8.4でdeprecated ○ PHP9.0でエラー ● 一見「なぜこんな仕様が今まであったのか?」と思えるものでも、歴史的な経緯に よる理由がある ● ?T構文やT|nullを使って型をnull許容するか、ツールで一括修正しましょう

Slide 15

Slide 15 text

© 2012-2024 BASE, Inc. #phpstudy 宣伝 15 PHPカンファレンス2024のCfPを公開しました! もっとPHPに詳しくなりたいあなたも、PHPに詳しいあなたもぜひプロポーザルお待ち しております! https://fortee.jp/phpcon-2024/speaker/proposal/cfp