পিএইচপি ডিজাইন প্যাটার্ন : ট্রেইট
অবজেক্ট ওরিয়েন্টেড পিএইচপি ডিজাইন প্যাটার্নের ক্ষেত্রে ট্রেইট একটি চমৎকার ডিজাইন।
ট্রেইট কী ও কেন?
পিএইচপি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের সাথে যারা পরিচিত, তারা জানেন যে, পিএইচপিতে একটি ক্লাস শুধু একটি ক্লাসকেই ইনহেরিট করতে পারে। এক ক্লাসে একাধিক ক্লাস ইনহেরিট করা সম্ভব নয়, যেমনটি সি++ বা পাইথনে সম্ভব। কিন্তু অনেক সময় একই ধরনের বিভিন্ন ফাংশনালিটি একাধিক ক্লাসে ব্যবহার করার প্রয়োজন হতে পারে। সেক্ষেত্রে ট্রেইট ব্যাবহার করা যেতে পারে। আমরা একই ধরনের কিছু ফাংশনকে একটি ট্রেইটে রাখতে পারি। পরবর্তীতে যেসব ক্লাসে আমাদের সেই ফাংশনগুলো ব্যবহারের প্রয়োজন হয়, সেগুলোতে আমরা ট্রেইট ফাংশনগুলো কল করতে পারি। পিএইচপির ৫.৪ সংস্করণ থেকে ট্রেইট ব্যবহারের সুযোগ দেয়া হয়। ট্রেইট আমাদেরকে একটি ক্লাসে অন্যান্য একাধিক ফাংশন ব্যবহারের সুযোগ করে দেয়।
ব্যবহারের নিয়ম
মনে করি, একটি এ্যাপ্লিকেশনে বিভিন্ন ক্লাসে বারবার যোগ-বিয়োগ করতে হয়। সেক্ষেত্রে আমরা একটি ট্রেইট বানিয়ে সেখানে যোগ-বিয়োগের ফাংশনগুলো রাখতে পারি এবং প্রয়োজনমতো বিভিন্ন ক্লাসে ফাংশনগুলো ব্যবহার করতে পারি।
নিচের মতো করে ট্রেইট ডিফাইন করতে হয়:
এখানে উপরের অংশে easyMath নামে একটা ট্রেইট ডিফাইন করা হয়েছে। যার অধীনে দুটি ফাংশন আছে। ফাংশনগুলোর কাজ হলো দুটি সংখ্যা যোগ বা বিয়োগ করা।
আমরা এই ট্রেইটটিকে ক্লাসের মাঝে এভাবে ব্যবহার করতে পারি:
এখানে MyClass নামক ক্লাসে আমরা easyMath ট্রেইটটি ব্যবহার করেছি। ফলে আমরা যদি এই ক্লাসের কোনো অবজেক্ট তৈরি করি, তাহলে সেই অবজেক্ট থেকে আমরা easyMath ট্রেইটের ফাংশনগুলোও ব্যবহার করতে পারব। যেমন নিচের উদাহরণটি:
উপরে আমরা MyClass এর একটি অবজেক্ট তৈরি করেছি। তারপর সেই অবজেক্টের দুটি ফাংশন ব্যবহার করেছি, যা মূলত ট্রেইটের মাধ্যমে ক্লাসে ব্যবহার করা হয়েছে।
লারাভেলে ট্রেইট ব্যবহারের উদাহরণ
লারাভেলে বিভিন্ন ডিজাইন প্যাটার্ন ব্যবহার করা হয়েছে। এর মাঝে ট্রেইটও রয়েছে। লারাভেল ৫.৬ এর ডকুমেন্টেশনে কিউ (Queues) জব ক্লাসের নিচের উদাহরণটি রয়েছে:
এই ProcessPodcast ক্লাসটিতে use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; লাইনটিতে মোট চারটি ট্রেইট ব্যবহার করা হয়েছে। ফাইলের শুরুতে নেমস্পেস ব্যবহার করে এই চারটি ট্রেইটের লোকেশন বলে দেয়া হয়েছে। এ কারণেই আমরা কন্ট্র্রোলারের ভেতর সরাসরি জব ক্লাসের ফ্যাসাড ব্যবহার করে Job::dispatch(); এর মাধ্যমে কোনো জব ডিসপ্যাচ করতে পারি। এমনকি আমরা চাইলে নিজেদের ব্যবহার করার জন্য লারাভেলে ট্রেইট বানিয়েও ব্যবহার করতে পারি।
