PHP 객체지향 프로그래밍에서 읽기 전용 속성

모든 속성이 비공개(private)인 클래스를 살펴보겠습니다:

Test.php<?php
  class Test
  {
    private $prop1 = 1;
    private $prop2 = 2;
  }
?>

이제 이 속성들이 외부 세계에서 읽기 전용으로만 접근 가능하도록 만들어 보겠습니다. 이전에 우리는 각 속성에 대해 게터(getter)를 만들고 세터(setter)를 만들지 않는 방식으로 이를 구현했습니다.

이제 이 문제를 해결하기 위해 마법 메서드 __get를 사용해 보겠습니다. 이 메서드에서 요청된 속성의 값을 반환할 것입니다. 방법은 다음과 같습니다: 요청된 속성의 이름은 __get 메서드의 매개변수, 우리의 경우에는 $property로 전달됩니다.

이는 변수에 저장된 이름의 속성을 다음과 같이 읽을 수 있다는 의미입니다: $this->$property (속성 이름은 변수이므로, 앞에 달러 기호가 붙습니다, 우리는 이전 강의에서 이것을 배웠습니다).

설명한 __get 메서드를 만들어 보겠습니다:

Test.php<?php
  class Test
  {
    private $prop1 = 1;
    private $prop2 = 2;
    
    public function __get($property)
    {
      return $this->$property;
    }
  }
?>

속성을 읽기 위해 이를 사용해 보겠습니다:

index.php<?php
  $test = new Test;
  
  echo $test->prop1; // 1을 출력합니다
  echo $test->prop2; // 2를 출력합니다
?>

속성에 무언가를 쓰려고 시도하면 오류가 발생합니다:

php<?php
  $test = new Test;
  $test->prop1 = 2; // 오류를 발생시킵니다
?>

이것이 바로 우리에게 필요한 것입니다: 속성은 읽을 수 있지만 쓸 수는 없습니다.

존재하지 않는 속성을 읽으려고 시도하면 오류가 발생합니다:

php<?php
  $test = new Test;
  echo $test->prop3; // 오류를 발생시킵니다
?>

또한 다음 세부 사항에 주의하십시오: 이전 방식으로 읽기 전용 속성을 만들었을 때, 속성을 읽기 위해 우리는 게터 메서드를 사용했습니다.

새로운 방식에서는 마치 공개(public) 속성인 것처럼 속성에 직접 접근할 것입니다. 그러나 비공개 속성인 것처럼 그 안에 쓸 수는 없을 것입니다.

Задание 1

다음과 같은 User 클래스가 주어졌다고 가정해 보겠습니다. 이 클래스의 속성들은 게터를 통해 읽기 전용으로만 접근 가능합니다:

php<?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를 사용하도록 수정하십시오.