【php】trait を使おう②

trait を使おう、第二弾です。

前回の → https://hacknote.jp/archives/24521/

まずは trait を宣言。今回は 3つ。

<?php
trait test_a
{
    public function test_function()
    {
        echo "aa" ;
    }
}

trait test_b
{
    public function test_function()
    {
        echo "bb" ;
    }
}

trait test_c
{
    public function test_function()
    {
        echo "cc" ;
    }
}

前回と異なり、それぞれの trait で function 名が被ってます。

こんな時、何もせずに trait を use すると

Fatal error: Trait method test_function has not been applied, because there are collisions with other trait methods on test
// 衝突してるよ!

こんな感じでエラーとなります。

そんな時は、何を使うか、指定してやります。

class test
{
    /** 使う trait を宣言する */
    use test_a, test_b, test_c
    {
        /** test_a の test_function を(test_b, test_c の同名の function に代わって)使うよ!  */
        test_a::test_function insteadof test_b, test_c ;
    }
}

$class = new test() ;

$class->test_function() ;

insteadof 句が重要ですね。

test_b の function を使いたい場合は

class test
{
    use test_a, test_b, test_c
    {
        test_b::test_function insteadof test_a, test_c ;
    }
}

こんな感じで、使いたいやつは前にしときます。

複数の trait を使う場合は使いそうですね。