OOP-ում PHP-ում ժառանգման ընթացքում մասնավոր հատկությունների խնդիրը

Փաստը, որ մասնավոր հատկությունները չեն ժառանգվում, կարող է հանգեցնել անսպասելի խնդրի: Եկեք նայենք օրինակով: Ենթադրենք, մենք ունենք հետևյալ ծնող դասը մասնավոր հատկությամբ.

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

Ենթադրենք, որ սերած դասում մենք որոշել ենք ստեղծել մեթոդ, որը կավելացնի տարիքը մեկով: Սակայն, ծնողի մասնավոր հատկությունը փոխելու փորձը կհանգեցնի սխալի.

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; // սխալ
      }
    }
  }
?>