20. DNFクラスの導入 (1/2)
21
◼ PHP 8.0で合併型(Union, OR),PHP 8.1で交差型(Intersection, AND)を導入.
◼ DNF (Disjunctive Normal Form, 選言標準形) はAND式をOR式で結合する構造
⇒合併型(Union, OR)と交差型(Intersection, AND)を結合する型宣言が可能になる.
◼ DNFは正規化された表現形式であり,処理系への負荷が低く,可読性も高い.理論的にあ
らゆる組み合わせを表現可能.
RFC: https://wiki.php.net/rfc/enumerations
interface A {}
interface B {}
interface C {}
interface D {
public function show(((A&B)|C $a): (A&B)|C;
}
A B C
21. DNFクラスの導入 (2/2)
22
◼ クラス継承:「共変性(戻り値)と反変性(引数)」の原則が適用される.
RFC: https://wiki.php.net/rfc/enumerations
A B C
✓ 戻り値:集合を縮小させる型宣言のみ有効
✓ 引数:集合を拡大させる型宣言のみ有効
interface D {
public function show(A&B $a): (A&B)|C;
}
class Moo implements D {
public function show((A&B)|C $a): A&B {}
} A B
戻り値:
集合が縮小(OK)
引数:
集合が拡大(OK)
22. バックトレース出力抑制
23
◼ 例外・エラー発生時にスタックトレースが表示または記録される
⇒ センシティブな情報(パスワード)が出力・記録されるリスクがある.
◼ #[¥SensitiveParameter] 属性を付与することで出力を抑制
RFC: https://wiki.php.net/rfc/redact_parameters_in_back_traces
<?php
function db_connect($user, $password) {
throw new ¥Exception('Error');
}
db_connect('taro', 'secret');
Fatal error: Uncaught Exception: Error in ../test.php:3
Stack trace:
#0 ../test.php(6): db_connect('taro',’secret’)
#1 {main}
thrown in test.php on line 3
<?php
function db_connect($user, #[¥SensitiveParameter] $password) {
throw new ¥Exception('Error');
}