PHP에서 OOP 상속 시 private 속성의 문제점

비공개 속성이 상속되지 않는다는 사실은 예상치 못한 문제를 일으킬 수 있습니다. 예시를 통해 살펴보겠습니다. 비공개 속성을 가진 다음과 같은 부모 클래스가 있다고 가정해 봅시다:

php<?php
  class User {
    private $age;
    
    public function setAge($age) {
      $this->age = $age;
    }
    public function getAge() {
      return $this->age;
    }
  }
?>

자식 클래스에서 나이를 1씩 증가시키는 메서드를 만들려고 합니다. 그러나 부모의 비공개 속성을 수정하려는 시도는 오류를 발생시킵니다:

php<?php
  class Student extends User {
    public function incAge() {
      $this->age++; // 오류
    }
  }
?>

자식 클래스에서 비공개 속성 $age를 선언하면 오류가 사라집니다:

php<?php
  class Student extends User {
    private $age;
    
    public function incAge() {
      $this->age++;
    }
  }
?>

여기에 함정이 숨어 있습니다! 사실 우리는 두 개의 비공개 속성을 만든 것입니다: 하나는 부모에, 하나는 자식에. 그리고 이 둘은 완전히 독립적으로 동작합니다. 이는 부모의 메서드들은 자신의 속성을 변경하고, 자식의 메서드들은 자신의 속성을 변경한다는 것을 의미합니다.

이 문제는 사실 해결 방법이 있습니다. 부모의 비공개 속성은 해당 부모의 메서드를 통해 조작해야 합니다. 이에 따라 코드를 다음과 같이 다시 작성해 보겠습니다:

php<?php
  class Student extends User {
    public function incAge() {
      $age = $this->getAge();
      $age++;
      $this->setAge($age);
    }
  }
?>

다음과 같이 단순화할 수 있습니다:

php<?php
  class Student extends User {
    public function incAge() {
      $this->setAge($this->getAge() + 1);
    }
  }
?>
Задание 1

다음 코드에서 자식 클래스는 부모 클래스의 메서드를 재정의합니다. 이 코드의 문제점을 수정하세요:

php<?php
  class User {
    private $name;
    
    public function setName($name) {
      $this->name = $name;
    }
    public function getName() {
      return $this->name;
    }
  }
  
  class Employee extends User {
    public function setName($name) {
      if (strlen($name) > 0) {
        $this->name = $name; // 오류
      }
    }
  }
?>