PHP-তে OOP-তে উত্তরাধিকারের সময় ব্যক্তিগত বৈশিষ্ট্যের সমস্যা
ব্যক্তিগত বৈশিষ্ট্যগুলি উত্তরাধিকার সূত্রে প্রাপ্ত নয়这一事实 একটি অপ্রত্যাশিত সমস্যার দিকে নিয়ে যেতে পারে। এর একটি উদাহরণ দেখা যাক। ধরুন আমাদের নিম্নলিখিত প্যারেন্ট ক্লাস আছে একটি ব্যক্তিগত বৈশিষ্ট্য সহ:
<?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; // ত্রুটি
}
}
}
?>