PHP-এ OOP-এ ট্রেইট

আপনি ইতিমধ্যেই জানেন যে, PHP-এ একসাথে একাধিক ক্লাস থেকে ইনহেরিট করা যায় না, শুধুমাত্র একটি থেকেই পারে। আমরা ইতিপূর্বে এই সমস্যার সমাধান নিয়ে আলোচনা করেছি: ইনহেরিটেন্সের পরিবর্তে অন্য ক্লাসের ভিতরে একটি ক্লাসের অবজেক্ট ব্যবহার করা।

PHP-এ আরও একটি পদ্ধতি রয়েছে। এটি হলো ট্রেইট ব্যবহার করা। একটি ট্রেইট হল কিছু প্রপার্টি এবং মেথডের সংগ্রহ, যা অন্য ক্লাসে অন্তর্ভুক্ত করা যায়। সেক্ষেত্রে ট্রেইটের প্রপার্টি এবং মেথডগুলো ক্লাস দ্বারা তার নিজের মত করেই অনুভূত হবে।

একটি ট্রেইটের সিনট্যাক্স একটি ক্লাসের মতই, শুধুমাত্র এই ব্যতীত যে ট্রেইটের নাম ডিক্লেয়ার করতে হবে trait কী-ওয়ার্ড ব্যবহার করে।

ট্রেইটের একটি ইন্সট্যান্স তৈরি করা যায় না - ট্রেইটগুলি শুধুমাত্র অন্য ক্লাসে সংযুক্ত করার জন্য উদ্দেশ্যে করা। সংযোগ নিজেই করা হয় use কমান্ড ব্যবহার করে, যার পরে একটি স্পেস দিয়ে সংযুক্ত ট্রেইটের নাম উল্লেখ করা হয়। এই কমান্ডটি ক্লাসের শুরুতে লেখা হয়।

আসুন একটি ব্যবহারিক উদাহরণে ট্রেইটের প্রয়োগ দেখি। ধরুন আমাদের কাছে এই Helper ট্রেইটটি দেওয়া আছে, যাতে প্রাইভেট প্রপার্টি name এবং age রয়েছে, এবং তাদের গেটারও রয়েছে:

Helper.php<?php
  trait Helper
  {
    private $name;
    private $age;
    
    public function getName()
    {
      return $this->name;
    }
    
    public function getAge()
    {
      return $this->age;
    }
  }
?>

ধরুন আমাদের কাছে User নামের这样一个 একটি ক্লাসও রয়েছে, যার কনস্ট্রাক্টরে name এবং age প্রপার্টিগুলি সেট করা হয়:

User.php<?php
  class User
  {
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age = $age;
    }
  }
?>

এখন আসুন আমাদের User ক্লাসের জন্য প্রপার্টির গেটার যোগ করি। শুধুমাত্র সেগুলি ক্লাসের ভিতরে লিখব না, বরং শুধু Helper ট্রেইটটি সংযুক্ত করব, যেখানে এই মেথডগুলি ইতিমধ্যেই ইমপ্লিমেন্ট করা আছে:

User.php<?php
  class User
  {
    use Helper; // ট্রেইট সংযুক্ত করছি
    
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age = $age;
    }
  }
?>

ট্রেইট সংযুক্ত করার পর আমাদের ক্লাসে সেই ট্রেইটের মেথড এবং প্রপার্টি উপস্থিত হবে। এ情况下 আমরা সেগুলিকে ক্লাসের自己的 মেথড এবং প্রপার্টির মত করেই অ্যাক্সেস করব:

index.php<?php
  $user = new User('john', 30);
  echo $user->getName(); // আউটপুট দেবে 'john'
  echo $user->getAge();  // আউটপুট দেবে 30
?>
Задание 1

City ক্লাসটি ইমপ্লিমেন্ট করুন name, age, population প্রপার্টি এবং তাদের জন্য গেটার সহ। আমাদের ক্লাসটি যেন তার নিজের কোড সংক্ষিপ্ত করার জন্য ইতিমধ্যে আমাদের দ্বারা তৈরি করা Helper ট্রেইটটি ব্যবহার করে।