ปัญหาของคุณสมบัติส่วนตัวในการสืบทอดใน OOP ใน PHP
ข้อเท็จจริงที่ว่าคุณสมบัติส่วนตัวไม่ถูกสืบทอด สามารถนำไปสู่ปัญหาที่ไม่คาดคิดได้ มาดูตัวอย่างกัน สมมติว่าเรามี คลาสพ่อแม่ที่มีคุณสมบัติส่วนตัว ดังต่อไปนี้:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
สมมติว่าในคลาสลูก เราได้ตัดสินใจ สร้างเมธอดที่จะเพิ่ม อายุขึ้นหนึ่งหน่วย อย่างไรก็ตาม ความพยายาม ในการเปลี่ยนแปลงคุณสมบัติส่วนตัวของคลาสพ่อแม่ จะนำไปสู่ข้อผิดพลาด:
<?php
class Student extends User {
public function incAge() {
$this->age++; // ข้อผิดพลาด
}
}
?>
ข้อผิดพลาดจะหายไป ถ้าในคลาสลูก
ประกาศคุณสมบัติส่วนตัว $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
นี่คือจุดที่กับดักรอเราอยู่! ในความเป็นจริง เราได้สร้าง คุณสมบัติส่วนตัวสองอัน: หนึ่งอันในคลาสพ่อแม่ และอีกอันในคลาสลูก และพวกมันทำงาน อย่างอิสระต่อกันโดยสิ้นเชิง นั่นหมายความว่า เมธอดของคลาสพ่อแม่จะเปลี่ยนแปลง คุณสมบัติของมันเอง และเมธอดของคลาสลูก - คุณสมบัติของมันเอง
ปัญหานี้ในความเป็นจริงมี วิธีแก้ไข เพียงแค่ต้องจัดการ คุณสมบัติส่วนตัวของคลาสพ่อแม่ ผ่านเมธอดของคลาสพ่อแม่นั้น มาเขียนโค้ดของเราใหม่ ให้สอดคล้องกับสิ่งนี้:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
สามารถทำให้ง่ายขึ้นได้:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
ในโค้ดต่อไปนี้ ในคลาสลูก ได้มีการโอเวอร์ไรด์เมธอดของคลาสพ่อแม่ โปรดแก้ไขปัญหาในโค้ดนี้:
<?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; // ข้อผิดพลาด
}
}
}
?>