2024年11月19日
新機能、改善点、非推奨機能に加えて、2024年のこの時期(年末)には、PHPのリリースサイクルに調整が加えられます。現在サポートされているすべてのバージョンのセキュリティリリースの終了は、PHPのGA版リリース時ではなく年末に同期されることになる見込み。
PHP8.4のサポートは1年延長のため、2028年まで安全に使うことができます(2年間はセキュリティとバグ修正、2年間はセキュリティ修正のみ)
昨年リリースされたPHP8.3の新機能は、今回の8.4で導入された一部機能と比較してご紹介。
プロパティフックは、PHPのオブジェクト指向プログラミング(OOP)における、「ゲッター(getter)」と「セッター(setter)」の扱いに全く新しいアプローチを導入し、クラスファイルの構造を単純化することを可能にします。
プロパティフックで置き換えられる例として、以下のような$sizeと$flavor。これらのプロパティは、外部から直接アクセスされないようにするため、privateとして設定されています。このため、publicであるgetterメソッドとsetterメソッドがプロパティへのアクセスを仲介します。
class Coffee
{
private string $size;
private string $flavor;
public function __construct(string $size, string $flavor) {
$this->size = $size;
$this->flavor = $flavor;
}
// コーヒーのサイズと風味を設定(セット)
public function setSize(string $size): void {
$this->size = $size;
}
public function setFlavor(string $flavor): void {
$this->flavor = $flavor;
}
// コーヒーのサイズと風味を取得(ゲット)
public function getSize(): string {
return $this->size;
}
public function getFlavor(): string {
return $this->flavor;
}
} // クラス終了
// コーヒーを淹れる
$coffee = new Coffee('スモール', 'パンプキンスパイス');
print $coffee->getSize() . ' ' . $coffee->getFlavor(); // 「スモール・パンプキンスパイス」を出力
// 注文を変更
$coffee->setSize('グランデ');
$coffee->setFlavor('モカ');
print $coffee->getSize() . ' ' . $coffee->getFlavor(); // 「グランデ・モカ」を出力あるいは、クラスに多くのプロパティがあり、getterメソッドやsetterメソッドを多数書く代わりに、マジックメソッドの_getや_setを使用するかもしれません。以下のように、やや雑なswitch文で整理することも可能です。
// __setマジックメソッドの例
public function __set(string $key, $value): void
switch ($key) {
case 'size':
$this->size = $value;
break;
case 'flavor':
$this->flavor = $value;
break;
default:
throw new InvalidArgumentException('無効な入力です');
}
}
// 後でコーヒーの順番をこのように変更できる
$coffee->size = 'グランデ';
$coffee->flavor = 'モカ';どのような方法をとるにしても、クラス内のプロパティの数が多ければ多いほど、 操作するコードは、クラスファイルの先頭付近の定義から遠ざかることになります。
さらに、_getと_setマジックメソッドの実装によっては、公開する予定のなかったオブジェクトのprivateプロパティやprotectedプロパティへのアクセスを提供してしまうことも。
新たに導入されるプロパティフックは、ゲッターとセッターの機能をプロパティ自体に組み込みます。以下の例では、Coffeeクラスの$size プロパティと$flavorプロパティがpublicになっていますが、setフックには基本的なバリデーション(チェック機能)が追加され、直接の代入とは区別されています。
// Coffeeクラスのトップにあるプロパティ定義
class Coffee
{
public string $flavor {
set(string $value) {
if (strlen($value) > 16) throw new InvalidArgumentException('入力が長すぎます');
$this->flavor = $value;
}
}
public string $size {
set(string $value) {
if (! in_array($value, array(‘スモール’, ‘グランデ’))) throw new InvalidArgumentException('有効なサイズではありません');
$this->size = $value;
}
}
// 残りのCoffeeクラス
}
// コーヒーを定義
$coffee = new Coffee();
$coffee->size = 'グランデ';
$coffee->flavor = 'パンプキンスパイス';先ほどの一般に公開されている、getterメソッドやsetterメソッドは、クラス内のprivateプロパティやprotectedプロパティにアクセスするための従来のアプローチ。
PHP 8.4の便利な機能として、アクセスされるコンテキストによって、プロパティの可視性のレベルを変更することが可能。つまり、あるプロパティが読み込まれるときにはpublicでも、設定時にはprivateまたはprotectedになるということです。
以下、例
class Coffee
{
public private(set) string $flavor = 'パンプキンスパイス';
}
$coffee = new Coffee();
print $coffee->flavor; // 「パンプキンスパイス」を出力
$coffee->flavor = 'モカ'; // エラー(可視性)この例は、クラスの$flavorプロパティは、設定コンテキスト以外ではpublicです。すでにかなりシンプルですが、非対称の可視性にはさらに便利な方法も。
class Coffee
{
// コンテキストが設定されていない場合はpublicを想定
private(set) string $flavor = 'パンプキンスパイス';
}プロパティフックと非対称の可視性を組み合せて使うことで、さまざまな可視性のオブジェクトプロパティを柔軟に扱うことができます。
new連結短縮形といえば、これまでnewや連鎖メソッドを呼び出すには以下のように括弧でくくる必要がありました。
$coffee = (new Coffee())->getFlavor()->getSize();PHP8.4では、括弧でくくる必要がなくなります。
$coffee = new Coffee()->getFlavor()->getSize();小さな変更に思えますが、このちょっとした括弧を削除するだけで可読性が上がり、デバッグしやすくなる事は間違いなしですね。
PHP 8.4ではarray_find()という関数が導入されます。これはコールバック関数で指定された条件に一致するメンバ関数を配列要素から探すことができます。
この関数は、コールバック関数のテストに一致する最初の要素の値を返します。
array_find_key():array_find()と同様だが、戻り値は要素そのものの値ではなく一致した要素のキーarray_all():テストする配列のすべての要素がコールバックのテストに一致する場合はtruearray_any():配列の要素の少なくとも1つがコールバックのテストに一致する場合はtrue最後の2つの関数は、配列のキーや内容の代わりに真偽値を返すことに注意してください。
その他、PHP8.4で非推奨となる機能の一つに、Cookieレスセッション追跡なども多くありますが、自社サイトのPHPバージョンがとても低いのでバージョンアップをそれなりの費用で改修したい!という場合は、お気軽にフォーム、ChatWorkからご連絡ください。
Webサイトリニューアルから新規ホームページ制作・運営・保守まで、目的達成を実現いたします。
各種Webサイト・ECサイト制作、広告代行に関するご相談、ご質問などお気軽にお問合せ下さい。
Tel : 03-5324-2318 / Email : info@reinc.jp