15. 列挙型(enum)の導入
17
◼ 列挙型(enumeration)を導入:データ範囲に制約を課せるようになる
◼ クラスなので,メソッドも定義可能
RFC: https://wiki.php.net/rfc/enumerations
var_dump(Status::BETA);
var_dump(Status::BETA->value);
enum(Status::BETA)
string(12) "Beta Release"
enum Status : string {
case ALPHA = "Alpha Release";
case BETA = "Beta Release";
case RELEASE = "Public Release";
public function getVersion(): string {
return match($this) {
Status::ALPHA, Status::BETA => '0.x',
Status::RELEASE => '1.0'
};
}
}
var_dump(Status::ALPHA->getVersion());
string(3) "0.x"
16. 交差型(Intersection)の導入
18
class Test {
private Traversable&Countable $ci;
public function setIterator(Traversable&Countable $c) {
$this->ci = c;
}
public function getIterator(): Traversable&Countable {
return $this->ci;
}
}
◼ 合併型(Union): PHP 8.0で導入,引数・戻り値の型の候補を複数指定
◼ 交差型(Intersection): PHP 8.1で導入, 積集合
◼ クラス(インターフェイス)でのみ使用可能
RFC: https://wiki.php.net/rfc/pure-intersection-types
17. function redirect(string $uri): never {
if ($uri==='') {return;}
header('Location:'.$uri);
exit();
}
never型
19
function redirect(string $uri): never {
header('Location:'.$uri);
exit();
}
◼ 処理を戻さないことを指定 ⇒ 常に throw または exit
◼ 開発時に整合性を確認できる.
RFC: https://wiki.php.net/rfc/noreturn_type
処理を戻すとエラー発生
A never-returning function must not return
値を戻す処理を追加
18. readonly指定子
20
class Test {
public readonly string $prop;
public function __construct(string $v) {
$this->prop=$v;
}
}
◼ 読み込みのみ可能を指定
◼ 初期化後は書き込み不可となる
◼ 型を指定する変数のみ指定可能(指定しない場合はmixedを指定)
RFC: https://wiki.php.net/rfc/readonly_properties_v2
$obj = new Test("foo");
var_dump($obj->prop); // foo
$obj->prop="boo";
書き込むとエラー発生
初期化時はOK
Cannot modify readonly property Test::$prop
19. finalクラス定数
21
◼ 従来:クラス定数は子クラスで上書きできてしまう.
◼ PHP 8.1:finalをつけることで変更禁止となる.
RFC: https://wiki.php.net/rfc/final_class_const
class Foo {
public const X = "foo";
}
class Bar extends Foo {
public const X = "bar";
}
class Foo {
final public const X = "foo";
}
class Bar extends Foo {
public const X = "bar";
}
PHP 8.1
PHP Fatal error: Bar::X cannot override final constant Foo::X
22. new式による引数デフォルト値
24
◼ パラメータにデフォルト値としてnewオブジェクトを直接指定できるようになる.
class Test {
private Logger $log;
public function __construct(?Logger $log = null) {
$this->log=$log ?? new NullLogger;
}
}
RFC: https://wiki.php.net/rfc/new_in_initializers
class Test {
public function __construct(private Logger $log = new NullLogger) {}
}
PHP 8.1
28. メソッド継承におけるstatic変数
30
◼ クラスメソッド継承におけるstatic変数の扱い変更:独立→共有
class A { // static var in method
public static function counter() {
static $cnt = 0;
return ++$cnt;
}
}
class B extends A {}
var_dump(A::counter());
var_dump(A::counter());
var_dump(B::counter());
var_dump(B::counter());
int(1)
int(2)
int(3)
int(4)
PHP 8.1
class A { // static var in class
private static $cnt = 0;
public static function counter() {
return ++static::$cnt;
}
}
class B extends A {}
int(1)
int(2)
int(3)
int(4)
int(1)
int(2)
int(1)
Int(2)
従来
https://wiki.php.net/rfc/static_variable_inheritance