PHP Object Oriented Programming পর্ব-৮: Abstract Class and Methods

PHP তে Abstract Class কি?

PHP Abstract Class

Abstract Class and Methods Abstract Class and Methods

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 দুই ধরনের মেথডই থাকতে পারে।

Zend Certified PHP Engineering (ZCPE) Course

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 দেখাচ্ছে।

Zend Certified PHP Engineering (ZCPE) Course

উদাহরণ ৩:

এবার আমরা দেখবো সম সংখ্যক 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 গুলোর শক্তি প্রদর্শন করে।

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম Zend Certified Engineer । ২০০৯ সালে কম্পিউটার সাইন্স থেকে বেচেলর ডিগ্রী অর্জন করি। দীর্ঘ ১৫ বছর আমি Winux Soft, SSL Wireless, IBCS-PRIMAX, Max Group, Canadian International Development Agency (CIDA), Care Bangladesh, World Vision, Hellen Keller, Amarbebsha Ltd সহ বিভিন্ন দেশি বিদেশী কোম্পানিতে ডেটা সাইন্স, মেশিন লার্নিং, বিগ ডেটা, ওয়েব ডেভেলপমেন্ট এবং সফটওয়্যার ডেভেলপমেন্ট এর উপর বিভিন্ন লিডিং পজিশন এ চাকরি এবং প্রজেক্ট লিড করি। এছাড়াও বাংলাদেশের ১৮৫ জন জেন্ড সার্টিফাইড ইঞ্জিনিয়ার এর মধ্যে ১২০ এরও অধিক ছাত্র আমার হাতে জেন্ড সার্টিফাইড ইঞ্জিনিয়ার হয়েছেন। বর্তমানে w3programmers ট্রেনিং ইনস্টিটিউট এ PHP এর উপর Professional এবং Advance Zend Certified PHP -8.2 Engineering, Laravel Mastering Course with ReactJS, Python Beginning To Advance with Blockchain, Machine Learning and Data Science, Professional WordPress Plugin Development Beginning to Advance কোর্স করাই। আর অবসর সময়ে w3programmers.com এ ওয়েব টেকনোলজি নিয়ে লেখালেখি করি।

One thought on “PHP Object Oriented Programming পর্ব-৮: Abstract Class and Methods

  1. মাশাঅাল্লাহ ! সুন্দর উদ্যোগ । অল্প কথায় সাবলীলভাবে পিএইচপি বুঝাচ্ছেন । অাপনার এই উদ্যোগ প্রশংসনীয় ।

Leave a Reply