PHP Object Oriented Programming
PHP Object Oriented Programming পর্ব-৮: Abstract Class and Methods
PHP তে Abstract Class কি?
PHP তে Abstract Class হচ্ছে এক ধরনের বিশেষ class যার থেকে কোনো Object instantiate বা তৈরী করা যাবেনা। কিন্তু Class গুলো থেকে child class তৈরী বা inherit করা যাবে। কোনো class কে abstract ঘোষণা করতে হলে class keyword এর সামনে abstract keyword টি দিতে হয়। “যেমন- abstract class className{....}
” . কোন class এর মধ্যে যদি এক বা একাধিক abstract Method থাকে, সেটিকে অবশ্যই Abstract class হিসেবে Declare করতে হবে । তবে Abstract Class এ abstract এবং Non-Abstract দুই ধরনের মেথডই থাকতে পারে।
PHP তে Abstract Method কি?
PHP তে Abstract Method একধরণের বিশেষ Class Method যার বডিতে কোনো code define করা থাকেনা শুধু Method Signature থাকে , অর্থাৎ শুধুমাত্র Method এর নাম এবং Parameter সমূহ Declare করা থাকে। কোনো Method কে abstract ঘোষণা করতে হলে function keyword এর সামনে abstract keyword টি দিতে হয়। তারপর perentheses “( )” তারপর semicolon ” ; ” দিতে হয়। “যেমন- abstract function functionName();
“. Abstract Method গুলোকে সম সংখ্যক Parameter সহ child class এ অবশ্যই implement করতে হবে। অর্থাৎ, আপনি চাইলেই child class এ কোন Method এর একটি Parameter যোগ বা বাদ দিতে পারবেন না । তবে default value সহ Parameter যোগ করতে পারবেন। Abstract Method গুলোর Visibility একই অথবা বেশি Open রাখতে হবে অর্থাৎ protected থাকলে protected অথবা public রাখতে হবে। abstract method কে private ঘোষণা করা যায়না।
এবার চলুন কয়েকটা উদাহরণ দেখা যাক।
উদাহরণ ১:
<?php abstract class AbstractClass{ // Our abstract method only needs to define the required arguments abstract protected function getName($name); } class childClass extends AbstractClass{ public function getName($name) { return 'Hi '.$name.' !'; } } $class = new childClass; echo $class->getName('Shahriar'), '\n'; ?>
Result:
Hi! Shahriar
উদাহরণ ২:
এবার আমরা দেখবো সম সংখ্যক Parameter ছাড়া child class এ implement করলে কি সমস্যা হতে পারে।
<?php abstract class AbstractClass{ // Our abstract method only needs to define the required arguments abstract protected function getName($name); } class childClass extends AbstractClass{ public function getName($name,$prefix) { return 'Hi'.$name.' !'; } } $class = new childClass; echo $class->getName('Shahriar', 'Mr. '), '\n'; ?>
Result:
Fatal error: Declaration of childClass::getName($name, $prefix) must be compatible with AbstractClass::getName($name) in [...][...]on line 11
ব্যাখ্যা: লক্ষ্য করুন parent class এ getName Method এ Parameter ছিল একটি , এখন child class এ কোনো default value ছাড়া অতিরিক্ত Parameter দেয়াই PHP একটি fatal error দেখাচ্ছে।
উদাহরণ ৩:
এবার আমরা দেখবো সম সংখ্যক Parameter ছাড়া child class এ implement করার পদ্ধতি ।
<?php abstract class AbstractClass{ // Our abstract method only needs to define the required arguments abstract protected function getName($name); } class childClass extends AbstractClass{ public function getName($name,$prefix='Mr. ') { return 'Hi '.$prefix.$name.' !'; } } $class = new childClass; echo $class->getName('Shahriar'), '\n'; ?>
Result:
Hi Mr. Shahriar !
ব্যাখ্যা: লক্ষ্য করুন parent class এ getName Method এ Parameter ছিল একটি , এখন child class এ default value সহ অতিরিক্ত Parameter দেওয়ার পরও PHP কোনো error ছাড়াই ফলাফল দেখাচ্ছে।
একটি content management system (CMS) তৈরিতে Abstract Class এবং Abstract Method এর ব্যবহার :
ধরা যাক আমরা একটি content management system (CMS) তৈরি করছি যেখানে আমাদের বিভিন্ন ধরনের content রয়েছে: articles, videos এবং images. প্রতিটি ধরনের কন্টেন্টের সাধারণ ফাঙ্কশনালিটি যেমন display() এবং getInfo() থাকতে হবে, তবে তাদের নির্দিষ্ট ফাঙ্কশনালিটিও থাকতে পারে।
<?php // Abstract class defining common methods abstract class Content { protected $title; protected $author; public function __construct($title, $author) { $this->title = $title; $this->author = $author; } abstract public function display(); public function getInfo() { return "Title: {$this->title}, Author: {$this->author}"; } } // Concrete class for articles class Article extends Content { private $content; public function __construct($title, $author, $content) { parent::__construct($title, $author); $this->content = $content; } public function display() { echo "Displaying article: {$this->title} by {$this->author}\n"; echo $this->content . "\n"; } } // Concrete class for videos class Video extends Content { private $duration; public function __construct($title, $author, $duration) { parent::__construct($title, $author); $this->duration = $duration; } public function display() { echo "Playing video: {$this->title} by {$this->author}, Duration: {$this->duration} seconds\n"; } } // Concrete class for images class Image extends Content { private $resolution; public function __construct($title, $author, $resolution) { parent::__construct($title, $author); $this->resolution = $resolution; } public function display() { echo "Displaying image: {$this->title} by {$this->author}, Resolution: {$this->resolution}\n"; } } // Usage $article = new Article("PHP Abstract Class Example", "John Doe", "This is the content of the article."); $video = new Video("Introduction to PHP", "Jane Smith", 120); $image = new Image("Beautiful Sunset", "Alex Johnson", "1920x1080"); $article->display(); echo $article->getInfo() . "\n"; $video->display(); echo $video->getInfo() . "\n"; $image->display(); echo $image->getInfo() . "\n"; ?>
এই উদাহরণে, Content class টি হচ্ছে common properties এবং methods সহ একটি abstract class. Article, Video এবং Image ক্লাসগুলি Content ক্লাসকে extend করে এবং display() মেথডের জন্য তাদের নির্দিষ্ট বাস্তবায়ন প্রদান করে। আর getInfo() মেথডটি abstract class থেকে inherited সূত্রে প্রাপ্ত।
এইভাবে, আপনি নিশ্চিত করতে পারেন যে প্রতিটি ধরণের কনটেন্ট তাদের নিজ নিজ ক্লাসে নির্দিষ্ট বাস্তবায়নের অনুমতি দেওয়ার সময় সাধারণ ফাঙ্কশনালিটিগুলি শেয়ার করে।
একটি hypothetical e-commerce system তৈরিতে Abstract Class এবং Abstract Method এর ব্যবহার :
একটি hypothetical e-commerce system এর জন্য একটি আরও বিস্তৃত উদাহরণ বিবেচনা করা যাক। এই উদাহরণে, আমরা Product নামে একটি abstract class তৈরি করব যা একটি generic product এর প্রতিনিধিত্ব করে। Product class এর কিছু common properties এবং methods থাকবে এবং তারপর আমরা নির্দিষ্ট ধরনের প্রোডাক্টের জন্য কংক্রিট ক্লাস তৈরি করব, যেমন Book, Electronics, এবং Clothing.
<?php // Abstract class defining common methods and properties for a product abstract class Product { protected $name; protected $price; protected $brand; public function __construct($name, $price, $brand) { $this->name = $name; $this->price = $price; $this->brand = $brand; } abstract public function displayInfo(); public function calculateDiscount($discountPercentage) { return $this->price * (1 - ($discountPercentage / 100)); } } // Concrete class for Books class Book extends Product { private $author; private $genre; public function __construct($name, $price, $brand, $author, $genre) { parent::__construct($name, $price, $brand); $this->author = $author; $this->genre = $genre; } public function displayInfo() { echo "Book: {$this->name} by {$this->author}, Genre: {$this->genre}, Price: {$this->price}\n"; } } // Concrete class for Electronics class Electronics extends Product { private $manufacturer; private $specifications; public function __construct($name, $price, $brand, $manufacturer, $specifications) { parent::__construct($name, $price, $brand); $this->manufacturer = $manufacturer; $this->specifications = $specifications; } public function displayInfo() { echo "Electronics: {$this->name} by {$this->manufacturer}, Specifications: {$this->specifications}, Price: {$this->price}\n"; } } // Concrete class for Clothing class Clothing extends Product { private $size; private $material; public function __construct($name, $price, $brand, $size, $material) { parent::__construct($name, $price, $brand); $this->size = $size; $this->material = $material; } public function displayInfo() { echo "Clothing: {$this->name}, Size: {$this->size}, Material: {$this->material}, Price: {$this->price}\n"; } } // Usage $book = new Book("The Great Gatsby", 19.99, "Penguin", "F. Scott Fitzgerald", "Fiction"); $electronics = new Electronics("Smartphone", 499.99, "Samsung", "Samsung Electronics", "5.5-inch display, 64GB storage"); $clothing = new Clothing("T-Shirt", 14.99, "Nike", "Medium", "Cotton"); $book->displayInfo(); echo "Discounted Price: {$book->calculateDiscount(10)}\n"; $electronics->displayInfo(); echo "Discounted Price: {$electronics->calculateDiscount(5)}\n"; $clothing->displayInfo(); echo "Discounted Price: {$clothing->calculateDiscount(15)}\n"; ?>
এই উদাহরণে, Product abstract class টি name, price এবং brand এর মতো common property গুলিকে ডিফাইন করে, পাশাপাশি displayInfo() এবং calculateDiscount() এর মতো সাধারণ মেথড গুলির সাথে। Book, Electronics, এবং Clothing এর মতো Concrete class গুলি Product class কে extend করে, displayInfo() method এর জন্য নির্দিষ্ট বাস্তবায়ন প্রদান করে।
প্রতিটি product type এর জন্য নির্দিষ্ট বিহেভিয়ার এনাবল করার সময় এই ডিজাইনটি আপনাকে শেয়ার করা কার্যকারিতা সহ বিভিন্ন ধরণের product তৈরি করতে দেয়। এটি একটি আরও feature-rich এবং practical example যা related class গুলির একটি hierarchy তৈরিতে abstract class গুলোর শক্তি প্রদর্শন করে।
One thought on “PHP Object Oriented Programming পর্ব-৮: Abstract Class and Methods”
Leave a Reply
You must be logged in to post a comment.
মাশাঅাল্লাহ ! সুন্দর উদ্যোগ । অল্প কথায় সাবলীলভাবে পিএইচপি বুঝাচ্ছেন । অাপনার এই উদ্যোগ প্রশংসনীয় ।