PHPにおけるOOPの読み取り専用プロパティ
すべてのプロパティがプライベートなクラスを考えてみましょう:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
これらのプロパティが外部から読み取り専用でアクセスできるようにしてみましょう。 以前は、各プロパティに対してゲッターを作成し、セッターを作成しないことでこれを行っていました。
この問題を解決するために、マジックメソッド__getを利用してみましょう。
その中で要求されたプロパティの値を返します。
どうやって行うか:要求されたプロパティの名前は、メソッド__getのパラメータ、この場合は$propertyに渡されます。
これは、変数に格納された名前のプロパティを、このように読み取ることができることを意味します:
$this->$property(プロパティ名は変数、つまり先頭にドル記号が付きます。これは以前のレッスンで学びました)。
説明したメソッド__getを作成してみましょう:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
プロパティの読み取りに利用してみましょう:
<?php
$test = new Test;
echo $test->prop1; // 1を表示
echo $test->prop2; // 2を表示
?>
プロパティに何かを書き込もうとするとエラーが発生します:
<?php
$test = new Test;
$test->prop1 = 2; // エラーを出力
?>
これがまさに必要なことです:プロパティは読み取ることはできますが、書き込むことはできません。
存在しないプロパティを読み取ろうとするとエラーが発生します:
<?php
$test = new Test;
echo $test->prop3; // エラーを出力
?>
また、次のニュアンスにも注意してください: 以前の方法で読み取り専用プロパティを作成したとき、プロパティを読み取るためにはゲッターメソッドを使用していました。
新しい方法では、あたかもプロパティがパブリックであるかのようにアクセスします。しかし、それらがプライベートであるかのように書き込むことはできません。
ゲッターを使用して読み取り専用でアクセスできる、次のようなUserクラスがあるとします:
<?php
class User
{
private $name;
private $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
ゲッターの代わりにマジックメソッド__getを使用するように、このクラスのコードを書き換えてください。