PHP Object Oriented Programming পর্ব-৯: PHP Object Interface

Object Oriented Programming এ Object Interface কি?

PHP OOP interface

Object Oriented Programming এ PHP Object Interface এর ধারণা টা অনেকটা একজন Web Developer এর কাজের ধরণের মত। একজন Web Developer যখন কোনো একটি HTML Template বানায় প্রথমে তাকে একটি PSD ডিজাইন দেয়া হয়। এর মাধ্যমে Web Developer বুঝতে পারে তাকে HTML দিয়ে কি বানাতে হবে। অর্থাৎ এর রং , মেনু এবং বাটন এবং এর input গুলো দেখতে কেমন হবে এসবই বর্ননা করা থাকে PSD ডিজাইনে। একজন Web Developer চাইলেই কিন্তু PSD ডিজাইনকে সরাসরি ব্যবহার করতে পারেনা অথবা ব্যবহার করা সম্ভবও না। এর মানে হলো আপনাকে অবশ্যই PSD থেকে HTML এ কনভার্ট করে একে ব্যবহার করতে হবে। আর একে বলা হয় Implementation। তাহলে এখানে PSD টিই হলো পুরো Template এর একটি Interface অর্থাৎ Template টি কেমন হবে তা এখানেই বর্নানা করা হয়েছে, আর Object Oriented Programming এর interface ও একই। আপনার একটি interface থাকবে যেখানে আপনি class গুলো কি কাজ করবে তা থাকবে। কিন্তু কিভাবে কাজ করবে সেটি বলা থাকবে না। আর interface গুলোকে আপনি সরাসরি ব্যবহার করতে পারবেন না, সেজন্য অবশ্যই একে class এর উপর implement করে নিতে হবে।। abstract class আর interface প্রায় একই, শুধু পার্থক্য হচ্ছে abstract class এ property, constant, abstract এবং non-abstract সব ধরনের Method ই থাকতে পারে এবং সবগুলো Method এর Visibility public অথবা protected থাকতে পারে । কিন্তু interface এর মধ্যে শুধু method থাকতে পারবে এবং সবগুলো Method বাই ডিফল্ট abstract Method হিসেবে থাকে এবং সবগুলো Method এর Visibility অবশ্যই public হতে হবে। সাধারণত: একটা child class শুধু মাত্র একটা Parent Class থেকেই inherit করতে পারে, অর্থাৎ, একই সময়ে একাধিক class থেকে inherit করতে পারেনা। কিন্তু একটা class এর উপর একই সময়ে একাধিক interface implement করা যায়। interface এর সবগুলো Method কে সম সংখ্যক Parameter সহ যেই class এ implement করা হয়েছে সেই class এ অবশ্যই implement করতে হবে। অর্থাৎ, আপনি চাইলেই implement কৃত class এ কোন Method এর একটি Parameter যোগ বা বাদ দিতে পারবেন না । তবে default value সহ Parameter যোগ করতে পারবেন।

Zend Certified PHP Engineering (ZCPE) Course

interface ঘোষণা করার নিয়ম কি?

PHP Object Interface ঘোষণা করার জন্য interface keyword এর পর interface এর নাম দিতে হয়। নিচের সিনটেক্স টি দেখুন :

<?php
interface MyInterface {
  public function aMethod();
  public function anotherMethod();
}
?>

PHP Object Interface কে class এর মধ্যে implement করার নিয়ম কি?

interface কে কোনো class এ implement করতে হলে class এর নামের পর implements keyword দিতে হয়, তারপর interface এর নাম গুলোকে কমা (,) দিয়ে লিখতে হয়। নিচের সিনটেক্স টি দেখুন :

<?php
class MyClass implements MyInterface1,...,MyInterfaceN {
  public function aMethod() {
    // (code to implement the method)
  }
  public function anotherMethod() {
    // (code to implement the method)
  }
}
?>

interface ব্যবহার করে এইবার একটা বাস্তব উদাহরণে আশা যাক:

Zend Certified PHP Engineering (ZCPE) Course

উদাহরণস্বরূপ , একটি Web Forum এর কথা ধরা যাক , Forum মেম্বারদের information কে Database থেকে তুলে আনা এবং সংরক্ষণ করার জন্য একটা Member class থাকবে। এবং ফোরাম মেম্বারদের তৈরী করা টপিক গুলোকে তুলে আনা এবং সংরক্ষণ করার জন্য একটা Topic Class থাকবে। এবং এগুলো একটা আরেকটা থেকে আলাদা থাকবে , কারণ তারা প্রত্যেকে আলাদা আলাদা ভাবে কাজ করে। কিন্তু দুটি class ই Data তুলে আনা এবং সংরক্ষণ এর মত কিছু common কাজ করে।

যাইহোক, আমরা Member এবং Topic দুটি Object দিয়ে MySQL Database থেকে Data তুলে আনা এবং সংরক্ষণ এর মত কিছু common কাজগুলো করার জন্য Persistable নামে একটা interface তৈরী করব। যা Database এর common কাজগুলো করার জন্য Method গুলোকে নির্দিষ্ট করে দেবে। নিচের উদাহরণটি দেখুন :

interface Persistable {
  public function save();
  public function load();
  public function delete();
}

এখন আসুন আমরা আমাদের Member Class তৈরী করব , এবং এর মধ্যে Persistable interface কে implement করব। এর মানে হল যে Member Class এর মধ্যে অবশ্যই save(), load() এবং delete() Method গুলো implement করতে হবে। পাশাপাশি class এর নিজস্ব Method গুলো ও থাকবে। নিচের উদাহরণটি দেখুন :

<?php
class Member implements Persistable {
  private $username;
  private $location;
  private $homepage;
  public function __construct( $username, $location, $homepage ) {
    $this->username = $username;
    $this->location = $location;
    $this->homepage = $homepage;
  }
  public function getUsername() {
    return $this->username;
  }
  public function getLocation() {
    return $this->location;
  }
  public function getHomepage() {
    return $this->homepage;
  }
  public function save() {
    echo "Saving member to database<br>";
  }
  public function load() {
    echo "Loading member from database<br>";
  }
  public function delete () {
    echo "Deleting member from database<br>";
  }
}
?>

একই ভাবে Topic Class তৈরী করব , এবং এর মধ্যে Persistable interface কে implement করব। এর মানে হল এখানেও Topic Class এর মধ্যে অবশ্যই save(), load() এবং delete() Method গুলো implement করতে হবে। পাশাপাশি class এর নিজস্ব Method গুলো ও থাকবে। নিচের উদাহরণটি দেখুন :

<?php
class Topic implements Persistable {
  private $subject;
  private $author;
  private $createdTime;
  public function __construct( $subject, $author ) {
    $this->subject = $subject;
    $this->author = $author;
    $this->createdTime = time();
  }
  public function showHeader() {
    $createdTimeString = date( 'l jS M Y h:i:s A', $this->createdTime );
    $authorName = $this->author->getUsername();
    echo "$this->subject (created on $createdTimeString by $authorName)<br>";
  }
  public function save() {
    echo "Saving topic to database<br>";
  }
  public function load() {
    echo "Loading topic from database<br>";
  }
  public function delete () {
    echo "Deleting topic from database<br>";
  }
}
?>

Zend Certified PHP Engineering (ZCPE) Course

এখন আমরা Member Object তৈরী করব getUsername() মেথড call করার জন্য। এবং Topic Object তৈরী করব showHeader() মেথড call করার জন্য। একই সাথে আমরা PHP Object Interface method গুলো যেমন save(), load() এবং delete() গুলো call করব, যেগুলো দুটি class এ implement করা হয়েছে।

<?php
$aMember = new Member( "Farhan", "Dhaka", 'https://blog.w3programmers.com/' );
echo $aMember->getUsername() . " lives in " . $aMember->getLocation() ."<br>";
$aMember->save();
$aTopic = new Topic( "Futonto Golap", $aMember );
$aTopic->showHeader();
$aTopic->save();
?>

Result

interface exampleচলুন আরো একটা উদাহরণ দেখা যাক:

<?php

// Interface defining a common set of methods
interface Shape {
    public function calculateArea();
}

// Classes implementing the Shape interface
class Circle implements Shape {
    private $radius;

    public function __construct($radius) {
        $this->radius = $radius;
    }

    public function calculateArea() {
        return pi() * pow($this->radius, 2);
    }
}

class Square implements Shape {
    private $side;

    public function __construct($side) {
        $this->side = $side;
    }

    public function calculateArea() {
        return pow($this->side, 2);
    }
}

// Usage
$circle = new Circle(5);
echo "Circle Area: " . $circle->calculateArea() . "\n";

$square = new Square(4);
echo "Square Area: " . $square->calculateArea() . "\n";

এই উদাহরণে, Shape interface টি calculateArea method কে সংজ্ঞায়িত করে। Circle এবং Square উভয় class এই interface টি বাস্তবায়ন করে, area ক্যালকুলেট করার জন্য তাদের specific implementations প্রদান করে। এটি নিশ্চিত করে যে Shape interface বাস্তবায়নকারী যেকোন ক্লাসের একটি calculateArea method থাকবে, কোডবেসে ধারাবাহিকতা প্রমোট করবে।

Flexible Logging System with Multiple Interface Implementations

<?php

// Interface for Logger
interface Logger {
    public function log($message);
}

// Interface for File Logging
interface FileLoggerInterface {
    public function setFilePath($filePath);
}

// Interface for Database Logging
interface DatabaseLoggerInterface {
    public function setDbConnection($dbConnection);
}

// FileLogger: Implements both Logger and FileLoggerInterface
class FileLogger implements Logger, FileLoggerInterface {
    private $logFilePath;

    public function setFilePath($filePath) {
        $this->logFilePath = $filePath;
    }

    public function log($message) {
        file_put_contents($this->logFilePath, "[" . date('Y-m-d H:i:s') . "] " . $message . "\n", FILE_APPEND);
    }
}

// DatabaseLogger: Implements both Logger and DatabaseLoggerInterface
class DatabaseLogger implements Logger, DatabaseLoggerInterface {
    private $dbConnection;

    public function setDbConnection($dbConnection) {
        $this->dbConnection = $dbConnection;
    }

    public function log($message) {
        // Simulate logging to a database
        $stmt = $this->dbConnection->prepare("INSERT INTO logs (message) VALUES (?)");
        $stmt->execute([$message]);
    }
}

// Usage
$fileLogger = new FileLogger();
$fileLogger->setFilePath('/path/to/logfile.txt');
$fileLogger->log('Log message written to file.');

$databaseLogger = new DatabaseLogger();
$databaseLogger->setDbConnection(new PDO('mysql:host=localhost;dbname=example', 'username', 'password'));
$databaseLogger->log('Log message written to database.');
?>

এই ডিজাইনটি প্রতিটি logger কে logging (Logger) এর জন্য একটি সামঞ্জস্যপূর্ণ interface বজায় রেখে তার প্রকারের সাথে সম্পর্কিত নির্দিষ্ট ফাঙ্কশনালিটি প্রদান করতে দেয়। ভবিষ্যতে প্রয়োজন হলে এটি আরো logger-specific interfaces যোগ করার ফ্লেক্সিবিলিটি প্রদান করে। usage section টি দেখায় যে আপনি logging করার আগে প্রতিটি logger টাইপের জন্য কীভাবে নির্দিষ্ট parameters সেট করতে পারেন।

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম 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 পর্ব-৯: PHP Object Interface

Leave a Reply