PHP8.1は、PHPのメジャーアップデートです。
Enum、読み取り専用プロパティ、callableの新シンタックス、Fiber、交差型、パフォーマンス向上など数々の新機能があります。
定数のかわりにENUMを使うことで、すっきりと書けるようになります。
読み取り専用プロパティは、一度でも値を割り当てると、その後変更することはできません。
これはValue ObjectやData Transfer Objectを実現するのに最適です。
class BlogData
{
private Status $status;
public function __construct(Status $status)
{
$this->status = $status;
}
public function getStatus(): Status
{
return $this->status;
}
}任意の関数へのリファレンスを取得できるようになりました。第一級callableと呼ばれます。
引数デフォルト値、およびstatic変数、グローバル定数、アトリビュート引数にnewを書けるようになりました。
特にアトリビュートの入れ子において威力を発揮します。
class Service
{
private Logger $logger;
public function __construct(
?Logger $logger = null,
) {
$this->logger = $logger ?? new NullLogger();
}
}class Service
{
private Logger $logger;
public function __construct(
Logger $logger = new NullLogger(),
) {
$this->logger = $logger;
}
}class User
{
/**
* @Assert\All({
* @Assert\NotNull,
* @Assert\Length(min=5)
* })
*/
public string $name = '';
}class User
{
#[\Assert\All(
new \Assert\NotNull,
new \Assert\Length(min: 5))
]
public string $name = '';
}交差型は、複数の型を全て満たすことを示す型です。
A&B|Cのように、交差型とUNION型を混在させることは今のところできません。
function count_and_iterate(Iterator $value) {
if (!($value instanceof Countable)) {
throw new TypeError('value must be Countable');
}
foreach ($value as $val) {
echo $val;
}
count($value);
}値を返さないことを示すnever型が追加されました。die()、exit()、trigger_error()等、関数内でスクリプトが中断される場合に使います。
function redirect(string $uri) {
header('Location: ' . $uri);
exit();
}
function redirectToLoginPage() {
redirect('/login');
echo 'Hello'; // <- dead code
}Finalクラス定数は、子クラスで上書きされないことが保証されるクラス定数です。
8進数を0oのプレフィックスで書くことができるようになりました。
Fiberは同時実行を実現する軽量な機能です。ジェネレータのような、スタックのどこからでも一時停止や再開が可能なコードを作ることができます。ただしFiber自体は必要最低限の機能しか持っていないため、非同期処理を実現するためにはイベントループ等の実装が必要です。
ユーザがFiberを直接使用することはほとんどなく、ライブラリを経由して利用することが推奨されます。
$httpClient->request('https://example.com/')
->then(function (Response $response) {
return $response->getBody()->buffer();
})
->then(function (string $responseBody) {
print json_decode($responseBody)['code'];
});これまでPHPは、スプレッド演算子による配列展開は数値キーしか対応していませんでした。PHP8.1では文字列キーの配列についてもアンパックに対応します。
#[ReturnTypeWillChange]アトリビュート。fsync・fdatasync関数。array_is_list関数。Serializableインターフェイスを非推奨化。$GLOBALSの扱いが他のグローバル変数と同じようになりました。file_infoが返す型はリソースからfinfoオブジェクトになりました。IMAP\Connectionオブジェクトになりました。FTP\Connectionオブジェクトになりました。GdFontオブジェクトになりました。LDAP\Connection・LDAP\Result・LDAP\ResultEntryオブジェクトになりました。PgSql\Connection・PgSql\Result・PgSql\Lobオブジェクトになりました。PSpell\Dictionary・PSpell\Configオブジェクトになりました。