PHP8のコンストラクタプロパティ昇格(Constructor Property Promotion)の使い方
PHP 8では「コンストラクタプロパティ昇格(Constructor Property Promotion)」という新機能が導入されました。この機能を使うと、シンプルなオブジェクトを生成する際に必要となる冗長なボイラープレートコードを大幅に削減できます。クラスプロパティの定義、コンストラクタの定義、変数への代入といった一連の処理を、コンストラクタのパラメータリスト内でひとつの構文としてまとめて記述できるようになります。
つまり、従来のようにクラスプロパティとコンストラクタを別々に定義する代わりに、コンストラクタプロパティ昇格を使えば、それらすべてを一度にまとめて書くことができるのです。
例1:PHP 7までの書き方
<?php
class Account {
public float $a;
public float $b;
public float $c;
public function __construct(
float $a = 0.0,
float $b = 0.0,
float $c = 0.0
) {
$this->a = $a;
$this->b = $b;
$this->c = $c;
}
}
?>
例2:PHP 8での書き方
上記のPHP 7のコードは、PHP 8では次のように書き換えられます。
<?php
class Account {
public function __construct(
public float $a = 0.0,
public float $b = 0.0,
public float $c = 0.0
) {}
}
$account = new Account(10.90, 20.0, 30.80);
print_r($account->a);
print_r($account->b);
print_r($account->c);
?>
出力結果
10.9 20 30.8
上記のコードでは、プロパティの定義と値の代入をコンストラクタのシグネチャ内にインラインでまとめています。これにより、同じ内容を何度も書く重複が解消され、コードがすっきりします。
例3:コンストラクタプロパティ昇格を使ったPHP 8コード
<?php
class Employee {
public function __construct(
public int $id,
public string $name
) {}
}
$employee = new Employee(11, 'Alex');
print_r($employee->id);
print_r($employee->name);
?>
出力結果
11 Alex
補足:コンストラクタプロパティ昇格のポイント
- 昇格できるのは、public / protected / private のいずれかのアクセス修飾子を付けたパラメータのみです。
- 昇格されたプロパティは、通常の型宣言付きプロパティと同様に扱えます。
- デフォルト値も指定できるため、省略可能な引数としても利用できます。
- DTO(データ転送オブジェクト)や値オブジェクトなど、単純なデータ保持用クラスで特に効果を発揮します。
-
JavaScriptのDateコンストラクタープロパティとは?使い方を実例で解説
JavaScriptのDateコンストラクタープロパティは、その日付オブジェクトを生成した元となるコンストラクター関数(Date())を返すプロパティです。すべてのJavaScriptオブジェクトが持つconstructorプロパティの一つで、Dateオブジェクトに対して使用すると、function Date() { [native code] }という形式の関数定義が出力されます。 このプロパティを活用することで、あるオブジェクトが本当にDateインスタンスであるかを確認したり、動的に新しいDateオブジェクトを生成したりすることができます。以下に、実際の動作を確認できるサンプルコードを紹介
-
JavaScriptのコンストラクターにプロパティやメソッドを追加する方法
JavaScriptでは、コンストラクター関数に対してprototype(プロトタイプ)を利用することで、後からプロパティやメソッドを追加することができます。この方法で追加したプロパティやメソッドは、そのコンストラクターから生成されたすべてのインスタンスで共有されるため、メモリの面でも効率的です。 サンプルコード 以下は、JavaScriptのコンストラクターにプロパティとメソッドを追加するコード例です。 <!DOCTYPE html> <html lang=en> <head> <meta charset=UTF-8 /> <meta n