PHP OOP Part-6: Polymorphism

Jamir Hossain
4 min readNov 28, 2023

--

এখন আমরা জানব পলিমরফিজম সম্পর্কে। পলিমরফিজম মানে কি? Polymorphism টার্মটাতে দুইটা পার্ট রয়েছে। একটা হচ্ছে Poly যার মানে হচ্ছে অনেক, আরেকটি হচ্ছে Morphism যার মানে হচ্ছে রূপ। তাহলে পলিমরফিজম মানে হচ্ছে অনেক রূপ বা বিভিন্ন রূপ। প্রোগ্রামিংয়ের ক্ষেত্রে পলিমরফিজম শব্দটা যখন ইউজ হয় তখন মূলত দুইটা টার্ম দিয়ে আমরা পলিমরফিজম অ্যাচিভ করতে পারি।

০১। প্রথম টার্মটা হচ্ছে মেথড ওভারলোডিং যাকে আবার কম্পাইল টাইম পলিমরফিজমও বলা হয়।

মেথড অভেরলোডিং টা হচ্ছে এরকম যেমন আমাদের যদি কোনো ক্লাসে এমন একটা মেথড থাকে যেটা একটা প্যারামিটার নিচ্ছে আবার আমরা যদি একদম সেই একই নামে আরেকটা মেথড ডিক্লেয়ার করি যেটা মাল্টিপল প্যারামিটার নিচ্ছে। অর্থাৎ আমি একটা ক্লাসের মধ্যে দুইটা Same নামের মেথড ডিক্লেয়ার করতে পারব কিন্তু তাদের প্যারামিটার সংখ্যা হচ্ছে ডিফারেন্ট। তার পর যখন আমরা এই ক্লাসের ইন্সট্যান্স তৈরি করে তৈরি করার পরে আমরা এই মেথড দুটোকে ইউজ করব তখন আমরা মেথড এর মধ্যে কয়টা প্যারামিটার পাস করতেছি সেটার উপর ডিপেন্ড করে কোন মেথড টা কল হবে এইটা ডিসাইড হবে। এর ফলে আমাদের একই মেথড সে প্যারামিটারের উপর ভিত্তি করে ভিন্ন ভিন্ন আচরণ করবে বা কাজ করবে।

এখন আমরা একটা কোড Example লক্ষ্য করি।

class Vehicle
{
public function getTotal($first, $second)
{
echo $first . " " . $second . "\n";
}

public function getTotal($first, $second, $third)
{
echo $first . " " . $second . " " . $third . "\n";
}
}

$vehicle = new Vehicle();
$vehicle->getTotal(10, 20);
$vehicle->getTotal(10, 20, 30);

এখানে আমরা দেখতে পাচ্ছি Vehicle ক্লাসে getTotal নামে দুইটি মেথড declare করা হয়েছে। এই দুইটি মেথর ডিফারেন্ট ডিফারেন্ট প্যারামিটার নিচ্ছে। এখন Vehicle ক্লাসের ইন্সট্যান্ট ক্রিয়েট করার পর যখন আমরা এই মেথডকে ইউজ করব তখন প্যারামিটারের উপর ডিপেন্ড করে মূলত এই মেথর দুটি behave করবে। যেমন আমরা দেখতে পাচ্ছি Vehicle ক্লাসের instance ক্রিয়েট করার পরে প্রথমে ২ টি প্যারামিটার দিয়ে এই getTotal মেথডকে কল করা হয়েছে ফলে এখানে ক্লাসের প্রথম getTotal মেথড টি call হবে। তার পর ৩ টি প্যারামিটার দিয়ে আবার এই getTotal মেথডকে করা হয়েছে ফলে এখানে ক্লাসের second getTotal মেথড টি call হবে। তাহলে আমরা বুঝতে পারলাম যে একই মেথড কিভাবে ভিন্ন ভিন্ন বিহেভ করে।

কিন্তু এই কোড যদি আপনি রান করেন তাহলে এটি কাজ করবে না কারণ পিএইচপিতে এই মেথড ওভারলোডিং বা কম্পাইল টাইম পলিমরফিজম সাপোর্ট করে না কিন্তু মেথড ওভাররাইডিং বা রানটাইম পলিমরফিজম সাপোর্ট করে। তবে আমরা Just থিওরিটা জানার জন্যই মূলত এই এক্সাম্পলটা দেখলাম।

০২। আর সেকেন্ড টার্ম টা হচ্ছে মেথড ওভাররাইডিং যেটাকে আবার রানটাইম পলিমরফিজমও বলা হয়।

মেথড ওভাররাইডিং টা হচ্ছে এরকম যেমন যদি কোনো একটা ক্লাসে এমন একটা মেথড থাকে যেটা কিছু প্যারামিটার নিতেও পারে আবার নাও নিতে পারে এবং এটি একটি নির্দিষ্ট কাজ করে। এখন যদি এই ক্লাস কে আরেকটি ক্লাস ইনহেরিট করে তার পর যদি একদম সেই একই নামে এই Child ক্লাসে মেথড ডিক্লেয়ার করা হয় তাহলে এই Process টাকে বলা হয় মেথড ওভাররাইডিং বা রানটাইম পলিমরফিজম। অর্থাৎ আমরা Child ক্লাসের মধ্যে Same নামের মেথড ডিক্লেয়ার করতে পারব কিন্তু তাদের প্যারামিটার সংখ্যা সেইম বা ডিফারেন্ট হতে পারে এবং এখানে এটি ভিন্ন কাজ করবে। তার পর যখন আমরা এই Child ক্লাসের ইন্সট্যান্স তৈরি করে আমরা এই মেথডকে ইউজ করব তখন আমরা মেথড এর মধ্যে কয়টা প্যারামিটার পাস করতেছি সেটার উপর ডিপেন্ড করে ডিসাইড হবে যে Parent নাকি Child এর মেথড টা কল হবে। এর ফলে আমাদের একই মেথড সে পেরামিটারের উপর ভিত্তি করে ভিন্ন ভিন্ন আচরণ করবে বা কাজ করবে।

এখন আমরা একটা কোড Example লক্ষ্য করি।

class Vehicle
{
public function getTotal($first, $second)
{
echo $first . " " . $second . "\n";
}
}

class Car extends Vehicle
{
public function getTotal($first, $second, $third = null)
{
echo $first . " " . $second . " " . $third . "\n";
}
}

$vehicle = new Car();
$vehicle->getTotal(10, 20);
$vehicle->getTotal(10, 20, 30);

এখানে আমরা দেখতে পাচ্ছি যে চাইল্ড ক্লাসের একটি ইন্সট্যান্ট তৈরি করা হয়েছে। তারপর ইন্সট্যান্ট থেকে getTotal মেথডটিকে ভিন্ন ভিন্ন পিরামিটার দিয়ে দুইবার কল করা হয়েছে। এখন যদি আমরা এই কোড রান করি তাহলে দেখতে পারবো যে এই getTotal মেথড তার পিরামিটার উপর ভিত্তি করে ভিন্ন ভিন্ন বিহেভ করছে। এখন এটি আসলে কিভাবে ভিন্ন ভিন্ন আচরণ করছে?

যখন চাইল্ড ক্লাসের instance থেকে দুটি প্যারামিটার দিয়ে এই getTotal মেথডকে কল করা হয়েছে তখন রানটাইমে এটি দেখবে যে এই চাইল্ড ক্লাসের মধ্যে দুটি প্যারামিটার দিয়ে এই ম্যাটরটি আছে কিনা। যদি না থাকে তাহলে এই Child ক্লাস তার ইনহেরিট করা Parent ক্লাস থেকে এই মেথডকে কল করবে।

পরবর্তীতে যখন আবার এই getTotal মেথডকে তিনটি প্যারামিটার দিয়ে কল করা হয় তখন এটি আবারো দেখবে যে এই চাইল্ড ক্লাসের মধ্যে তিনটি প্যারামিটার দিয়ে এই মেথডটি আছে কিনা। যখন দেখবে যে এই মেথডকে তিনটি পিরামিটার দিয়ে চাইল্ড ক্লাসে ওভাররাইড করা হয়েছে তখন এই চাইল্ড ক্লাসের এই getTotal মেথডকে কল করা হবে।

আর যদি প্যারেন্টের মেথড এবং চাইল্ডের মেথড এর মধ্যে সেইম প্যারামিটার থাকে তাহলে এক্ষেত্রেও চাইল্ড এর মধ্যে যে যেখানে মেথড ওভাররাইড করা হয়েছে সেই চাইল্ড এর মেথরটি কল হবে।

আর এভাবেই মূলত মেথড ওভাররাইড কাজ করে। তাহলে আমরা এখন বুঝতে পারলাম যে কিভাবে মেথড ওভাররাইড করতে হয় এবং কিভাবে এটি কাজ করে।

আশা করি এই পর্বের আলোচিত বিষয় গুলো সম্পর্কে আপনাদের প্রাথমিক ধারণা হয়েছে। তাহলে আজ এই পর্যন্তই, কথা হবে পরবর্তী লেছনে।

--

--