php8.5で変わったことを調べてみた
phpのバージョンが変わると新機能の実装やこれまで使用できていた関数の非推奨、廃止といったことに直面します。
バージョンアップ時には既存コードのままでは動作しなくなる場合もあるので対応が必要になります。
さて現時点での最新ver.である8.5ではどのような変更があったのでしょうか?
目次
パイプ演算子
これまでは複数の文字列置換などで以下のような処理が必要でした。
例:電話番号、郵便番号を半角かつハイフンなしに置換
$tel = '070-1234-5678';
$value = str_replace(['-','ー','―','-'], '', mb_convert_kana((string) $tel, 'a', $encoding));
新たに導入されたパイプ演算子を利用すると以下のように記述可能になります。
$tel = '070-1234-5678';
$value = $tel
|> mb_convert_kana((string) $value, 'a', $encoding)
|> str_replace(['-','ー','―','-'], '', $value);
複雑な入れ子が解消されて見やすいコードが実現します。
クローン時のプロパティ更新
clone() 関数に連想配列を渡すことで、オブジェクトのクローン時にプロパティを更新することができるようになりました。
例:色を定義して半透明に指定する
これまでは以下のように記述していました。
readonly class Color
{
public function __construct(
public int $red,
public int $green,
public int $blue,
public int $alpha = 255,
) {}
public function withAlpha(int $alpha): self
{
$values = get_object_vars($this);
$values['alpha'] = $alpha;
return new self(...$values);
}
}
$blue = new Color(79, 91, 147);
$transparentBlue = $blue->withAlpha(128);
clone()関数を利用すると以下のように指定可能です。
readonly class Color
{
public function __construct(
public int $red,
public int $green,
public int $blue,
public int $alpha = 255,
) {}
public function withAlpha(int $alpha): self
{
return clone($this, [
'alpha' => $alpha,
]);
}
}
$blue = new Color(79, 91, 147);
$transparentBlue = $blue->withAlpha(128);
アルファ値のみ連想配列で渡すだけなのでシンプルですね。
URI拡張モジュール
従来のURI解析は以下のように行っていました。
$components = parse_url('https://php.net/releases/8.4/en.php');
var_dump($components['host']);
// string(7) "php.net"
Uriクラスが利用可能になりました。
use Uri\Rfc3986\Uri;
$uri = new Uri('https://php.net/releases/8.5/en.php');
var_dump($uri->getHost());
// string(7) "php.net"
#[NoDiscard] アトリビュート
このアトリビュートを関数に追加すると、戻り値が利用されたかを PHP がチェックし、されていなければ警告を出します。
function getPhpVersion(): string
{
return 'PHP 8.4';
}
getPhpVersion(); // これまでは警告が出ない
php8.5からは次のようになります。
#[\NoDiscard]
function getPhpVersion(): string
{
return 'PHP 8.5';
}
getPhpVersion(); // warningが発生する
voidではない関数で戻り値を適切に使用しているかどうかが分かるようになりました。
非推奨となったもの
非正規な型名の使用
正規化されていない型名 (boolean), (integer), (double), (binary) が非推奨になりました。
正しくは次の型名を使用します。
(bool), (int), (float), (string)
booleanやintegerは間違えやすいですね。
特にLaravelのModelの型キャストではboolean、integerと指定するので混同しないように気をつけたいです。
Case文の末尾にセミコロンの使用
正しい記述
<?php
$i = 1;
switch ($i) {
case 0:
case 1:
case 2:
echo "iは3より小さいですが負ではありません";
break;
case 3:
echo "iは3です";
}
非推奨となった記述
<?php
$i = 1;
switch ($i) {
case 0;
case 1;
case 2;
echo "iは3より小さいですが負ではありません";
break;
case 3;
echo "iは3です";
}
正直Case文の末尾にセミコロンが指定できたということは初耳でした。
おそらく修正が必要なケースは少ないでしょう。
array_key_existsの$keyパラメーターへのnullの使用
現状はまだ使用可能ですが非推奨になります。
function array_key_exists(string|int|float|bool|resource|null $key, array $array): bool
nullの代わりに空文字でチェックする必要があります。
配列以外の変数を配列として扱うこと
以下のような場合warningが出ます。
明らかにバグ的な記述なので、逆になぜいままで出なかったのか謎です。
<?php
$str = ‘string’;
$value = $str[1]; // php8.5からwarning;
$array = list($str); // php8.5からwarning;
まとめ
廃止される関数は真っ先に修正しないといけませんが、非推奨となっているがまだ使用可能なものであっても将来的に廃止されるのでなるべく早い対応が必要です。
新しいバージョンがリリースされるたびに変更点の情報はチェックするようにしましょう。



















