PHP Object Oriented Programming পর্ব-৩: Method Chaining

PHP তে Method Chaining কি?

PHP তে যখন অনেক গুলো method কে একটি single instruction এর মধ্যে call করা হয়, PHP এর পরিভাষায় একে বলা হয় Method Chaining . আরেকটু সহজ ভাবে বুঝিয়ে বলি, ধরুন আপনার Person নামে একটা class আছে, যেখানে আপনার $name এবং $age নামে দুটি private property আছে। আর $name এবং $age property দুটিতে value set করার জন্য আছে যথাক্রমে setName() এবং setAge() নামক দুটি method. এবং সর্বশেষে $name এবং $age property দুটির value দেখানোর জন্য আছে getInfo() নামক method. এবং ধরুন আমাদের object টির নাম হচ্ছে $person. এখন আমরা যদি এই তিনটি method কে আলাদা আলাদা ভাবে object দিয়ে call না করে একটি single instruction এর মধ্যে ঠিক এইভাবে call করতে চাই : $person->setName(“Sahab Uddin”)->setAge(25)->getInfo(). PHP এর পরিভাষায় এই পদ্ধতিকে বলা হয় Method Chaining . Method Chaining এ class এর মধ্যের প্রত্যেকটি Method অর্থাৎ যেই class এর method সেই class এর object কে return করে। Method Chaining এর জন্য class এর মধ্যে যেকোনো value return এর পরিবর্তে return $this; কথাটি লিখতে হয়। চলুন পুরো ব্যাপারটা কয়েকটি উদাহরণের মাধ্যমে বুঝা যাক।

উদাহরণ ১: সাধারণ একটা class এবং তার রেজাল্ট

<?php
 class person
 {
    private $name="";
    private $age="";
 
    public function setName($name="")
    {
      $this->name=$name;
    }
    public function setAge($age="20")
    {
      $this->age=$age;
    }
    public function getInfo()
    {
      echo "Hello, My name is ".$this->name." and my age is ".$this->age." years.";
    }
}
 
$person = new person();
  $person->setName("Sahab Uddin");
  $person->setAge("25");
  $person->getInfo();
?>

Result

Hello, My name is Sahab uddin and my age is 25 years.

পাঠক লক্ষ্য করুন আমাদের person নামক class এর $name এবং $age property দুটিতে value set করার জন্য আমরা setName() এবং setAge() method দুটিকে আলাদা আলাদা ভাবে call করি . এবং সর্বশেষে $name এবং $age property দুটির value দেখানোর জন্য আলাদা ভাবে getInfo() নামক method কে call করি।

Method Chaining এর ব্যবহার :

উপরের class টিকে Method Chaining এ convert করতে হলে আপনাকে setName() Method এবং setAge() Method এর শেষে return $this; লাইনটি যুক্ত করে দিতে হবে। নিচের উদাহরণটি দেখুন :

<?php
class person
{
  private $name="";
  private $age="";
 
  public function setName($name="")
  {
    $this->name=$name;  
    return $this;
  }
  public function setAge($age="20")
  {
    $this->age=$age;
    return $this;
  }
 
  public function getInfo()
  {
    echo "Hello, My name is ".$this->name." and my age is ".$this->age." years.";
  }
}
 
$person = new person();
  $person->setName("Sahab Uddin")->setAge("25")->getInfo();
 ?>

Result

Hello, My name is Sahab Uddin and my age is 25 years.

ব্যাখ্যা : লক্ষ্য করুন আমরা setName() Method এবং setAge() Method দুটির মধ্যে $this pseudo-variable টি রিটার্ন করি। আর আমরা জানি “$this” pseudo-variable টি মূলত current class এর object কে ধারণ করে। প্রথমে আসা যাক $person->setName(‘Sahab Uddin’) এ . এটির কাজ হচ্ছে setName() Method কে call করবে এবং Name Property তে Sahab Uddin নামকে value হিসেবে সেট করবে। তারপর setName() মেথড $this রিটার্ন করবে , অর্থাৎ এটি Object person কে রিটার্ন করবে।

এরপরে আশা যাক ->setAge(’25’) তে , যেহেতু আমরা আগের setName() method থেকে chain object পেয়েছি , সুতরাং সেই person object দিয়েই আমরা setAge(25) কে call করা এবং age Property তে 25 age কে value হিসেবে সেট করবে। আবার এখানেও আমরা $this রিটার্ন করায়, একই ভাবে এখানেও মূলত আমাদের Object person কে chain রিটার্ন করবে।

সর্বশেষে ->getInfo() method দিয়ে আমরা পূর্বের ধারাবাহিকতায় chain রেজাল্ট পাই।

Static Method Chaining

Static Method Chaining সাধারণ Method Chaining এর মতোই। তবে এখানে প্রত্যেকটি static Method এর মধ্যে return $this এর পরিবর্তে return new static; কথাটা লিখতে হবে। নিচের উদাহরণ দেখুন :

<?php
class oop{
    public static $val;
     
    public static function init($var){
        static::$val=$var;
        return new static;      
    }
 
    public static function add($var){
        static::$val+=$var;
        return new static;
    }
 
    public static function sub($var){
        static::$val-=$var;
        return new static;
    }
 
    public static function out(){
        return static::$val;
    }
 
}
 
echo oop::init(10)->add(2)->sub(5)->out(); //Result: 10+2-5=7
echo "<br>"; 
echo oop::sub(2)->out(); //Result: 7-2=5;