৪. অবজেক্ট ওরিয়েন্টেড পিএইচপি: Inheritance
প্রোগ্রামিংয়ে অনেক সময়ই আমাদেরকে একি কোড পুনরায় ব্যবহার করার প্রয়োজন হয়। কিন্তু একি কোড বার বার ব্যবহারের কারনে কোড যেমন বড় হয় তেমনি কোডও অনেক হিজিবিজি হয়ে যায়। এ সমস্যা সমাধানের জন্যই অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ে Inheritance নিয়ে আসা হয়েছে।
Inheritance in OOP = When a class derives from another class.
Inheritance শব্দের অর্থ হলো উত্তরাধিকার। অর্থাৎ বংশানুক্রমে পিতা-মাতার কাছ থেকে সন্তান যে উত্তরাধিকার বা সম্পদ বা বৈশিষ্ট্য পায় তাই হলো Inheritance।
প্রোগ্রামিংয়ের ভাষায় যদি বলি তাহলে, একটি ক্লাস যখন তার আগের তৈরি কোনো ক্লাসের কাছ থেকে কোনো প্রপার্টি ও মেথড নিয়ে নিজের কাজে ব্যবহার করে তখন সেই বিষয়টাকেই Inheritance বলে।
আমার অনেক সময় আমাদের মায়েদেরকে বলতে শুনি,
তুই এককারে তর বাপের স্বভাব পাইছস।
এই যে, বাবার বৈশিষ্ট্য সন্তানের মাঝে দেখা যাচ্ছে বা সন্তান বাবার যে বৈশিষ্ট্য ধারন করছে এই ব্যাপারটাকেই প্রোগ্রামিংয়ের ভাষায় Inheritance বলে।
আর পেরেন্ট ক্লাস (আব্বা ক্লাস) থেকে প্রাপ্ত বৈশিষ্ট্যকে যে ক্লাস derive করেছে তাকে চাইল্ড ক্লাস (বাচ্চা ক্লাস) বলে। আর লেখার ক্ষেত্রে extends শব্দ ব্যবহার করে Inheritance তৈরি করতে হয়।
তাইলে এইবার আসেন আমরা কোডে দেখি কেমন এই Inheritance।
// The parent class has its properties and methods
class Car {
private $model;
public function setModel($model)
{
$this -> model = $model;
}
public function getModel()
{
return $this -> model;
}
}
//The child class can use the code it inherited from the parent //class, and it can also have its own code class SportsCar extends Car{
private $style = 'fast and furious';
public function driveItWithStyle()
{
return 'Drive a ' . $this -> getModel() . ' <i>' . $this -> style . '</i>';
}
}
//create an instance from the child class
$sportsCar1 = new SportsCar();
// Use a method that the child class inherited from the parent class
$sportsCar1 -> setModel('Ferrari');
// Use a method that was added to the child class
echo $sportsCar1 -> driveItWithStyle();
উপরের কোডে SportsCar
ক্লাসটি Car
নামক ক্লাসটিকেextends
করেছে। এতে করে, Car
ক্লাসের সকল প্রপার্টি ও মেথড উত্তরাধিকার সূত্রে SportsCar
ক্লাসের মাঝে চলে গেছে। তাহলে এখানে আব্বা ক্লাস হলোCar
নামক ক্লাসটি। আর বাচ্চা ক্লাসটি হলো SportsCar
নামক ক্লাসটি। তারপর সেই বাচ্চা ক্লাস(SportsCar
) থেকে একটি ইন্সট্যান্স $sportsCar1
তৈরি করা হয়েছে। সেই ইন্সট্যান্স ব্যবহার করে আব্বা ক্লাস Car
এর setModel($model)
মেথডের ভ্যালু সেট করা হয়েছে। তারপর ইন্সট্যান্স বাচ্চা ক্লাসের নিজস্ব মেথড driveItWithStyle()
কে কল করেছে।
Result:
Drive a Ferrari fast and furious.
Inheritance allows us to write the code only once in the parent, and then use the code in both the parent and the child classes.
এতক্ষন যা বকবক করলাম, তা যদি বুজে থাকেন তাহলে আপনি Inheritance বুঝে পেলেছেন। না বুজলে আবার পড়ুন প্রথম থেকে। আবার পড়ুন। বার বার পড়ুন।
Protected:
৩ নং অধ্যায়ে আমরা ২ ধরনের Access Modifier নিয়ে আলোচনা করেছি। সেগুলো হলো Public, Private। বাকি একটি Access Modifier নিয়ে পরে আলোচনা করবো বলেছিলাম। কারন তার জন্য আমাদের Inheritance ভালো করে বুজতে হবে। এখন আমরা সেই Protected Access Modifier নিয়ে আলোচনা করবো।
Protected হলো সেই Access Modifier যার মাধ্যমে শুধুমাত্র দুটি ক্লাস তাদের নিজেরদের প্রপার্টি ও মেথড ব্যবহারের সুযোগ পায়। আর সেই ক্লাস দুটি হচ্ছে parent class (আব্বা ক্লাস) child class (বাচ্চা ক্লাস)।
When we declare a property or a method as protected, we can approach it from both the parent and the child classes.
অর্থাৎ যখন কোনো child class তার parent class কে extends করে তখন parent class এর Protected প্রপার্টি ও মেথড শুধমাত্র child class ছাড়া আর কেউ ব্যবহার করতে পারবে না।parent class তার Protected প্রপার্টি ও মেথড শুধুমাত্র child class এর জন্যই বরাদ্দ রেখেছে। আর হা, parent class নিজেও কিন্তু তার Protected প্রপার্টি ও মেথড ব্যবহার করতে পারবে।
// The parent class
class Car { //The $model property is now protected, so it can be accessed
// from within the class and its child classes
protected $model;
public function setModel($model)
{
$this -> model = $model;
}
}
// The child class
class SportsCar extends Car { public function hello()
{
return "beep! I am a <i>" . $this -> model . "</i><br />";
}
}
//Create an instance from the child class
$sportsCar1 = new SportsCar();
//Set the class model name
$sportsCar1 -> setModel('Mercedes Benz');
//Get the class model name
echo $sportsCar1 -> hello();
উপরের কোডে লক্ষ্য করুন যে আমরা এবার $model
প্রোপার্টিকে private
না লিখে protected
লিখেছি। এর ফলে, child class SportsCar
সহজেই $model
প্রোপার্টিকে একসেস করতে পারছে । এক্ষেত্রে কোন getModel()
এর প্রয়োজন হচ্ছে না। child class কোন get
মেথড ছাড়াই $model
প্রোপার্টিকে একসেস করতে পারছে।
Result:
beep! I am a Mercedes Benz
এখানে একটি প্রশ্ন তৈরি হয়, “child class কি তাহলে চাইলেই তার parent class এর সব প্রপার্টি ও মেথডকে override করতে পারবে?”
উত্তর হলো হা, করতে পারবে।
// The parent class has hello method that returns "beep".
class Car {
public function hello()
{
return "beep";
}
}
//The child class has hello method that returns "Halllo"
class SportsCar extends Car {
public function hello()
{
return "Hallo";
}
}
//Create a new object
$sportsCar1 = new SportsCar();
//Get the result of the hello method
echo $sportsCar1 -> hello();
উপরের কোডে দেখুন, parent class তার hello()
মেথডে "beep"
রিটার্ন করেছে child class সেই hello()
মেথডের "beep"
কে পরিবর্তন করে "Hallo"
রিটার্ন করেছে।
দেখছেন, আজকালকার বাচ্চা গুলো কি বেয়াদ্দপের বেয়াদ্দপ, বাপ-মার কথা মানে না। বাপ-মা কয় একটা, হেরা এডারে উল্টায়া কয় আরেকটা।
এইসব বেয়াদব বাচ্চাদের ঠিক করার জন্য প্রোগ্রামাররা নিয়ে এসেছে আরেকটি keyword। যার নাম final keyword। parent class এর কোন প্রাপার্টি ও মেথডের আগে এই final শব্দটি বসিয়ে দিলেই পুলাপান যত বেয়াদবই হোক না কেন তারা আর বাপ-মায়ের উপর কথা বলতে পারবে না। পিতা-মাতা যাহাই বলিবেন তাহাই হবে, ইহার অন্যথা হইবে না।
class Car {
final public function hello()
{
return "beep";
}
}
এখন আমরা উপরের মত করে final keyword বসিয়ে দিলাম আমাদের কোডে। এখন child class যতই চেষ্টা করুক মেথডকে পরিবর্তন করার কোন কাজ হবে না।
নিচের মত এরর দিবে।
Result:
Fatal error: Cannot override final method Car::hello()
এতএব আমার বুজে গেলাম Inheritance কি? এবং কিভাবে Inheritance কাজ করে। Protected Access Modifier এর সাথে Inheritance এর কি সম্পর্ক? আর final keyword কখন ব্যবহার করতে হয়?
তাহলে আজকের মত এখানেই শেষ। আল্লাহ হাফেজ।