PHP OOP에서 속성 설정하기
매직 메서드 __set은 존재하지 않거나 숨겨진 속성의 값을 변경하려고 할 때 호출됩니다. 매개변수로는 속성 이름과 할당하려는 값을 받습니다.
실제 예시를 통해 살펴보겠습니다. 다음과 같은 Test 클래스가 있다고 가정합니다:
<?php
class Test
{
private $prop1;
private $prop2;
}
?>
이 클래스에 __set 매직 메서드를 만들어, 접근이 발생한 속성 이름과 설정하려는 값을 함수 var_dump를 통해 출력해 보겠습니다:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
var_dump($property . ' ' .$value);
}
}
?>
우리 클래스의 동작을 확인해 보겠습니다:
<?php
$test = new Test;
$test->prop = 'value'; // __set 메서드의 var_dump가 'prop value'를 출력합니다.
?>
이제 변수 $property에 저장된 이름의 속성에 값을 설정해 보겠습니다:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value; // 값을 설정합니다.
}
}
?>
이제 클래스 외부에서 비공개 속성에 쓸 수 있습니다:
<?php
$test = new Test;
$test->prop1 = 1; // 1을 씁니다.
$test->prop2 = 2; // 2를 씁니다.
?>
쓸 수는 있지만, 속성이 비공개이기 때문에 실제로 값이 제대로 쓰였는지 확인할 방법은 없습니다.
이러한 속성에 대한 getter를 만들거나, 매직 메서드 __get을 간단히 사용할 수 있습니다. 두 번째 방법을 사용해 보겠습니다:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value;
}
// 속성에 대한 매직 getter:
public function __get($property)
{
return $this->$property;
}
}
?>
이제 우리 클래스의 동작을 확인할 수 있습니다. 확인해 보세요:
<?php
$test = new Test;
$test->prop1 = 1; // 1을 씁니다.
$test->prop2 = 2; // 2를 씁니다.
echo $test->prop1; // 1을 출력합니다.
echo $test->prop2; // 2를 출력합니다.
?>
물론, 비공개 속성에 누구나 쓸 수 있도록 허용하는 것은 바람직하지 않습니다. 그렇게 되면 비공개 속성의 본래 목적이 사라지게 됩니다(차라리 공개 속성으로 만드는 것이 더 간단합니다).
따라서 이 메서드는 정말 필요한 경우에만 사용해야 합니다. 다음 강의들에서 유용하게 적용하는 예시들을 더 살펴보겠습니다.