কম্পিউটার টিউটোরিয়াল

PHP ট্রেইট (Traits)


পরিচিতি

PHP মাল্টিপল ইনহেরিটেন্স সাপোর্ট করে না। এই সীমাবদ্ধতা কিছুটা অতিক্রম করা হয়েছে ট্রেইট (Traits) ফিচারের মাধ্যমে। এটি কোড রিযুজের একটি মেকানিজম। ট্রেইটের ডেফিনিশন ক্লাসের মতোই। কিন্তু এটি সরাসরি ইনস্ট্যানশিয়েট করা যায় না। বরং, একটি ট্রেইটের ফাংশনালিটি use কীওয়ার্ড দিয়ে একটি ক্লাসে উপলব্ধ করা হয়। সুতরাং, একটি ক্লাস ট্রেইটে ডিফাইন করা মেথডগুলো ব্যবহার করতে পারে বা সেগুলো ওভাররাইডও করতে পারে। এটি অন্য যে কোনো পেরেন্ট ক্লাস থেকে ইনহেরিট করার পাশাপাশি।

একটি ট্রেইট ইন্টারফেসের মতোও। পার্থক্য হলো ইন্টারফেসে মেথডের ডেফিনিশন থাকে না, ইমপ্লিমেন্টিং ক্লাস সেটি করতে হয়। ট্রেইট মেথডে কিন্তু ডেফিনিশন থাকে, যা ট্রেইট ব্যবহারকারী ক্লাস ওভাররাইড করতে পারে বা নাও করতে পারে।

সিনট্যাক্স

<?php
trait testtrait{
    public function test1(){
        // মেথড বডি
    }
}
// ট্রেইট ব্যবহার
class testclass{
    use testtrait;
    // ক্লাসের বাকি মেম্বার
}
?>

উদাহরণ

নিচের কোডে, দুইটি মেথডসহ একটি ট্রেইট একটি ক্লাসে ব্যবহার করা হয়েছে যা 그중 একটি মেথড ওভাররাইড করেছে—

উদাহরণ

<?php
// ট্রেইট ডেফিনিশন
trait testtrait{
    public function test1(){
        echo "test1 method in trait\n";
    }
    public function test2(){
        echo "test2 method in trait\n";
    }
}
// ট্রেইট ব্যবহার
class testclass{
    use testtrait;
    public function test1(){
        echo "test1 method overridden\n";
    }
}
$obj=new testclass();
$obj->test1();
$obj->test2();
?>

আউটপুট

আউটপুট নিচের মতো—

test1 method overridden
test2 method in trait

চাইল্ড ক্লাসে ট্রেইট (Trait in child class)

এটিই ট্রেইটের প্রধান সুবিধা। একটি পেরেন্ট ক্লাস থাকা ক্লাসও একটি ট্রেইট ব্যবহার করতে পারে এবং এর মেথড ওভাররাইড করতে পারে। ফলে কার্যকরভাবে মাল্টিপল ইনহেরিটেন্স অর্জন হয়। নিচে উদাহরণ—

উদাহরণ

<?php
// ট্রেইট ডেফিনিশন
trait testtrait{
    public function test1(){
        echo "test1 method in trait\n";
    }
}
// পেরেন্ট ক্লাস
class parentclass{
    public function test2(){
        echo "test2 method in parent\n";
    }
}
// ট্রেইট ও পেরেন্ট ক্লাস ব্যবহার
class childclass extends parentclass{
    use testtrait;
    public function test1(){
        echo "parent method overridden\n";
    }
    public function test2(){
        echo "trait method overridden\n";
    }
}
$obj=new childclass();
$obj->test1();
$obj->test2();
?>

আউটপুট

উপরের কোড নিচের ফলাফল দেবে—

parent method overridden
trait method overridden

ইন্টারফেসসহ ট্রেইট (Trait with interface)

এক ক্লাস একই সাথে ইন্টারফেস ইমপ্লিমেন্ট করতে পারে, অন্য পেরেন্ট ক্লাস এক্সটেন্ড করতে পারে এবং ট্রেইট ব্যবহার করতে পারে—

উদাহরণ

<?php
// ট্রেইট ডেফিনিশন
trait mytrait{
    public function test1(){
        echo "test1 method in trait1\n";
    }
}
class myclass{
    public function test2(){
        echo "test2 method in parent class\n";
    }
}
interface myinterface{
    public function test3();
}
// ট্রেইট ও পেরেন্ট ক্লাস ব্যবহার
class testclass extends myclass implements myinterface{
    use mytrait;
    public function test3(){
        echo "implementation of test3 method\n";
    }
}
$obj=new testclass();
$obj->test1();
$obj->test2();
$obj->test3();
?>

আউটপুট

এটি নিচের আউটপুট দেবে—

test1 method in trait1
test2 method in parent class
implementation of test3 method

কনফ্লিক্ট রেজোলিউশন (Conflict resolution)

যদি একটি ক্লাস দুটি ট্রেইট ব্যবহার করে যাদের একটি কমন মেথড থাকে, তবে তাদের কনফ্লিক্ট স্কোপ রেজোলিউশন অপারেটর এবং insteadof কীওয়ার্ড দিয়ে রেজল্ভ করা হয়।

উদাহরণ

<?php
trait trait1{
    public function test1(){
        echo "test1 method in trait1\n";
    }
    public function test2(){
        echo "test2 method in trait1\n";
    }
}
trait trait2{
    public function test1(){
        echo "test1 method in trait2\n";
    }
    public function test2(){
        echo "test2 method in trait2\n";
    }
}
// ট্রেইট ব্যবহার
class testclass {
    use trait1, trait2{
        trait1::test1 insteadof trait2;
        trait2::test2 insteadof trait1;
    }
}
$obj=new testclass();
$obj->test1();
$obj->test2();
?>

আউটপুট

উপরের স্ক্রিপ্ট নিচের ফলাফল দেবে—

test1 method in trait1
test2 method in trait2

  1. PHP TypeError

  2. PHP ট্যাগস (PHP Tags)

  3. PHP pi() ফাংশন

  4. PHP-তে ট্রেইট (Trait) কী?