PHP8クラス:型と読み取り専用
クラスとオブジェクトの基礎
PHP 8 でのクラスとオブジェクトは、オブジェクト指向プログラミング(OOP)の基本概念を再確認する良い機会です。クラス定義は、プロパティとメソッドをまとめる設計図であり、インスタンス化によって実際のオブジェクトが生成されます。以下では、簡単なクラス定義とプロパティの型定義の例を示します。
<?php
class User {
public string $name;
private int $age;
public function __construct(string $name, int $age) {
$this->name = $name;
$this->age = $age;
}
public function greet(): string {
return "こんにちは、" . $this->name . "さん!";
}
}
?>
上記の例では、string と int の型定義を使用して、プロパティの型安全性を確保しています。PHP 8 では、型宣言がより厳格になり、実行時に型違反が検出されます。
コンストラクタの昇格とreadonlyプロパティ
PHP 8 で導入されたコンストラクタの昇格(Constructor Property Promotion)は、クラス定義を短く、読みやすくするための便利な機能です。さらに、readonly プロパティを使うことで、オブジェクト生成後に値を変更できない不変オブジェクトを簡単に作成できます。
<?php
class Product {
public function __construct(
public readonly string $id,
public readonly string $name,
public float $price
) {}
}
?>
この例では、id と name は readonly と宣言されているため、インスタンス化後に変更できません。price は通常のプロパティとして扱われ、変更可能です。コンストラクタの昇格により、プロパティ宣言とコンストラクタの引数を同時に定義でき、コード量が大幅に削減されます。
アクセス修飾子とthisの使い方
アクセス修飾子(public, protected, private)は、クラス内部と外部からのアクセス制御を行うための重要な概念です。this キーワードは、インスタンス自身を参照し、プロパティやメソッドにアクセスする際に使用します。
<?php
class Counter {
private int $count = 0;
public function increment(): void {
$this->count++;
}
public function getCount(): int {
return $this->count;
}
}
?>
上記の Counter クラスでは、private なプロパティ $count を外部から直接アクセスできないようにしています。increment メソッド内で $this->count を使用してプロパティを更新し、getCountで現在の値を取得します。こうした設計により、データの整合性を保ちながら、クラスの外部に対しては必要最低限のインターフェースだけを公開できます。
インスタンス化の例は以下の通りです。
<?php
$counter = new Counter();
$counter->increment();
echo $counter->getCount(); // 1
?>
このように、PHP 8 でのクラスとオブジェクト設計は、型安全性、コンストラクタの昇格、readonly プロパティ、アクセス修飾子、そして this の活用により、より堅牢で保守性の高いコードを書くことが可能です。
コメント
コメントを投稿