ปัญหาของคุณสมบัติส่วนตัวในการสืบทอดใน 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; // ข้อผิดพลาด
      }
    }
  }
?>