GetterとSetter
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 40/91。
アクセス修飾子を理解したところで、クラスの外部から private properties に安全にアクセスするにはどうすればよいでしょうか?答えは getter と setter です。これは private データへの制御されたアクセスを提供する public メソッドです。
getterはプロパティの値を取得し、setterはその値を変更します。このパターンを使うと、データにアクセスしたり変更したりする際に、検証やロジックを追加できます。
<?php
class User {
private string $email;
private int $age;
public function getEmail(): string {
return $this->email;
}
public function setEmail(string $email): void {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$this->email = $email;
}
}
public function getAge(): int {
return $this->age;
}
public function setAge(int $age): void {
if ($age >= 0 && $age <= 150) {
$this->age = $age;
}
}
}
$user = new User();
$user->setEmail("john@example.com");
$user->setAge(25);
echo $user->getEmail() . "\n";
echo $user->getAge();
出力:
john@example.com
25セッターは、値を保存する前に email の形式を検証し、age が妥当であることを確認します。セッターがなければ、誰でも無効なデータを直接 assign できてしまいます。getter のみを提供して読み取り専用のプロパティを作成したり、セッターのみで書き込み専用のプロパティを作成したりすることもできます。
重要なポイント: getter と setter を使うと、private データへのアクセス方法や変更方法を制御でき、検証、フォーマット、その他のカスタムロジックを適用できます。
チャレンジ
簡単getter と setter を使用して商品データを保護・検証する商品在庫システムを構築しましょう。価格が常に正の値で、在庫数量が負にならないことを保証する Product class を作成し、setter によってビジネスルールを適用する方法を示します。
コードを2つのファイルに分けて整理します。
Product.php: 3つの private properties、$name(string)、$price(float)、$stock(integer)を持つProductclass を作成します。各 property に対して getter と setter を Implement し、次の検証ルールを適用します。setName()は空でない文字列のみ accept する必要があります。trim 後に文字列が empty の場合は、property を更新しませんsetPrice()は 0 より greater な値のみ accept する必要があります。0 または負の価格は reject しますsetStock()は 0 以上の値のみ accept する必要があります。負の在庫数量は reject します
"[name]: $[price] ([stock] in stock)"を返し、価格を小数点以下2桁に format する public methodgetInfo()を追加します。main.php: Product ファイルを読み込みます。4つの inputs、つまり商品名、価格、在庫数量、更新に使用する new price を受け取ります。Productinstance を作成し、setter を使用して initial の名前、価格(float に変換)、在庫(integer に変換)を assign します。getInfo()の結果を Print します。次に、new price の値(float に変換)で価格の更新を試み、もう一度getInfo()を Print します。最後に、在庫を-5(invalid な値)に設定しようとし、在庫が changed されていないことを confirm するために、もう一度getInfo()を Print します。
setter は gatekeeper として機能します。private properties の変更を許可する前に、受け取ったデータを検証します。負の在庫のような invalid なデータが渡された場合、setter はそれを単に無視し、既存の有効な値をそのまま保持します。これが encapsulation の力です。外部のコードが何をしようとしても、object はその整合性を維持します。
自分で試してみよう
<?php
require_once 'Product.php';
// 入力を読み取る
$name = trim(fgets(STDIN));
$price = trim(fgets(STDIN));
$stock = trim(fgets(STDIN));
$newPrice = trim(fgets(STDIN));
// TODO: 新しい Product インスタンスを作成する
// TODO: セッターを使用して初期の name、price(float として)、および stock(integer として)を割り当てる
// TODO: getInfo() の結果を出力する
// TODO: newPrice(float として)で price を更新し、再度 getInfo() を出力する
// TODO: stock を -5(無効)に設定しようとし、getInfo() を出力して stock が変更されなかったことを確認する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ