PHP 객체지향 프로그래밍에서 읽기 전용 속성
모든 속성이 비공개(private)인 클래스를 살펴보겠습니다:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
이제 이 속성들이 외부 세계에서 읽기 전용으로만 접근 가능하도록 만들어 보겠습니다. 이전에 우리는 각 속성에 대해 게터(getter)를 만들고 세터(setter)를 만들지 않는 방식으로 이를 구현했습니다.
이제 이 문제를 해결하기 위해 마법 메서드 __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; // 오류를 발생시킵니다
?>
또한 다음 세부 사항에 주의하십시오: 이전 방식으로 읽기 전용 속성을 만들었을 때, 속성을 읽기 위해 우리는 게터 메서드를 사용했습니다.
새로운 방식에서는 마치 공개(public) 속성인 것처럼 속성에 직접 접근할 것입니다. 그러나 비공개 속성인 것처럼 그 안에 쓸 수는 없을 것입니다.
다음과 같은 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를 사용하도록 수정하십시오.