PHP-র OOP-এ ট্রেইট পদ্ধতির দ্বন্দ্ব সমাধান
যেহেতু একটি ক্লাস একাধিক ট্রেইট ব্যবহার করতে পারে, তাই আমাদের একটি সমস্যার সম্মুখীন হতে হতে পারে যখন দুটি ট্রেইটের একই নামের পদ্ধতি থাকে।
এই ক্ষেত্রে PHP একটি মারাত্মক ত্রুটি দেখাবে। পরিস্থিতি সংশোধন করতে, নামের দ্বন্দ্বটি স্পষ্টভাবে সমাধান করতে হবে। কিভাবে এটি করা হয় - আসুন অনুশীলনে দেখি।
ধরুন আমাদের কাছে একই নামের method সহ দুটি ট্রেইট রয়েছে:
<?php
trait Trait1
{
private function method()
{
return 1;
}
}
trait Trait2
{
private function method()
{
return 2;
}
}
?>
ধরুন আমাদের কাছে একটি Test ক্লাসও রয়েছে যা আমাদের উভয় ট্রেইট ব্যবহার করে। যদি শুধুমাত্র উভয় ট্রেইট আমাদের ক্লাসে সংযুক্ত করা হয়, তাহলে PHP একটি ত্রুটি দেখাবে, কারণ ট্রেইটগুলির মধ্যে মিলে যাওয়া পদ্ধতি রয়েছে:
<?php
// এই কোডটি একটি ত্রুটি দেখাবে!
class Test
{
use Trait1, Trait2; // ট্রেইট সংযুক্ত করি
}
?>
আসুন আমাদের ট্রেইটগুলির নামের দ্বন্দ্ব সমাধান করি। এর জন্য একটি বিশেষ অপারেটর insteadof রয়েছে। এই অপারেটর ব্যবহার করে আমরা Trait2 ট্রেইটের একই পদ্ধতির পরিবর্তে Trait1 ট্রেইটের method পদ্ধতিটি ব্যবহার করব:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
}
}
new Test;
?>
আপনি যেমন দেখতে পাচ্ছেন, এখানে বাক্য গঠনটি নিম্নরূপ: প্রথমে ট্রেইটের নাম, তারপর দুটি কোলন, তারপর পদ্ধতির নাম, তারপর আমাদের অপারেটর insteadof এবং দ্বিতীয় ট্রেইটের নাম।
আসুন পরীক্ষা করি:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
}
public function __construct()
{
echo $this->method(); // 1 দেখাবে, কারণ এটি প্রথম ট্রেইটের পদ্ধতি
}
}
new Test;
?>
সুতরাং, আমাদের ক্লাসে আমরা বলেছি যে যদি method পদ্ধতিটি ব্যবহার করা হয়, তবে এটি প্রথম ট্রেইট থেকে নেওয়া উচিত। বিপরীতটাও করা যেতে পারে - দ্বিতীয় ট্রেইটের পদ্ধতিটি নেওয়া:
<?php
class Test
{
use Trait1, Trait2 {
Trait2::method insteadof Trait1;
}
public function __construct()
{
echo $this->method(); // 2 দেখাবে, কারণ এটি দ্বিতীয় ট্রেইটের পদ্ধতি
}
}
new Test;
?>
যেকোনো ক্ষেত্রে, যদি আমরা একটি ট্রেইটের পদ্ধতি ব্যবহার করতে নির্দেশ দিই, তাহলে দ্বিতীয় ট্রেইটের পদ্ধতিটি অপ্রাপ্য হয়ে যায়। as কীওয়ার্ড ব্যবহার করে দ্বিতীয় ট্রেইটের পদ্ধতিটির নাম পরিবর্তন করেও ব্যবহার করা যেতে পারে, এভাবে:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
Trait2::method as method2;
}
public function __construct()
{
echo $this->method() + $this->method2(); // 3 দেখাবে
}
}
new Test;
?>
ইচ্ছে করলে প্রথম ট্রেইটের পদ্ধতির নামও পরিবর্তন করা যেতে পারে:
<?php
class Test
{
use Trait1, Trait2 {
Trait1::method insteadof Trait2;
Trait1::method as method1;
Trait2::method as method2;
}
public function __construct()
{
echo $this->method1() + $this->method2(); // 3 দেখাবে
}
}
new Test;
?>
insteadof এর মাধ্যমে প্রধান পদ্ধতি সংজ্ঞায়িত না করে শুধুমাত্র as কীওয়ার্ড ব্যবহার করা যায় না, এটি একটি ত্রুটি দেখাবে:
<?php
// এই ক্লাসটি একটি ত্রুটি দেখাবে:
class Test
{
use Trait1, Trait2 {
Trait1::method as method1;
Trait2::method as method2;
}
public function __construct()
{
echo $this->method1() + $this->method2();
}
}
new Test;
?>
Trait1, Trait2 এবং Trait3 নাম সহ 3টি ট্রেইট তৈরি করুন। প্রথম ট্রেইটে একটি method পদ্ধতি থাকুক যা 1 ফেরত দেয়, দ্বিতীয় ট্রেইটে - একই নামের একটি পদ্ধতি যা 2 ফেরত দেয়, এবং তৃতীয় ট্রেইটে - একই নামের একটি পদ্ধতি যা 3 ফেরত দেয়।
একটি Test ক্লাস তৈরি করুন যা আমাদের তৈরি করা তিনটি ট্রেইটই ব্যবহার করে। এই ক্লাসে একটি getSum পদ্ধতি তৈরি করুন যা সংযুক্ত ট্রেইটগুলির পদ্ধতির ফলাফলের যোগফল ফেরত দেয়।