web-dev-qa-db-ja.com

他の特性メソッドとの衝突

同じ名前のメソッドでどのようにトレイトを処理できますか?

trait FooTrait {
  public function fooMethod() {
        return 'foo method';
  }

  public function getRow() {
        return 'foo row';
  }
}

trait TooTrait {
    public function tooMethod() {
        return 'too method';
    }

    public function getRow() {
        return 'too row';
    }
}

class Boo
{
    use FooTrait;
    use TooTrait;

    public function booMethod() {
        return $this->fooMethod();
    }
}

エラー、

致命的なエラー:Booで他の特性メソッドとの衝突があるため、特性メソッドgetRowは適用されていません...

どうすればいいですか?

また、2つの同じメソッド名で、どうすればgetのメソッドtrait FooTrait

$a = new Boo;
var_dump($a->getRow()); // Fatal error: Call to undefined method Boo::getRow() in... 

編集:

class Boo
{
    use FooTrait, TooTrait {
        FooTrait::getRow insteadof TooTrait;
    }

    public function booMethod() {
        return $this->fooMethod();
    }
}

getRowからTooTrait経由でBooメソッドも取得したい場合はどうすればよいですか?出来ますか?

32
laukok

競合に関するPHPドキュメント:

2つの特性が同じ名前のメソッドを挿入した場合、競合が明示的に解決されないと、致命的なエラーが生成されます。

同じクラスで使用されるトレイト間の名前の競合を解決するには、代わりの演算子を使用して、競合するメソッドの1つを選択する必要があります。

これによりメソッドの除外のみが許可されるため、as演算子を使用して、競合するメソッドの1つを別の名前で含めることができます。

例5競合の解決

この例では、Talkerは特性AとBを使用します。AとBには競合するメソッドがあるため、特性BからSmalltalkのバリアントを使用し、特性AからbigTalkのバリアントを使用するように定義します。

Aliased_Talkerはas演算子を使用して、追加のエイリアストークの下でBのbigTalk実装を使用できるようにします。

<?php
trait A {
    public function Smalltalk() {
        echo 'a';
    }

    public function bigTalk() {
        echo 'A';
    }
}

trait B {
    public function Smalltalk() {
        echo 'b';
    }

    public function bigTalk() {
        echo 'B';
    }
}

class Talker {
    use A, B {
        B::Smalltalk insteadof A;
        A::bigTalk insteadof B;
    }
}

class Aliased_Talker {
    use A, B {
        B::Smalltalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as talk;
    }
}

だからあなたの場合には

class Boo {
    use FooTrait, TooTrait {
        FooTrait::getRow insteadof TooTrait;
    }

    public function booMethod() {
        return $this->fooMethod();
    }
}

別のuseを実行しても動作しますが、より明確だと思います

または、asを使用してエイリアスを宣言します。

59
Marco Acierno