同じ名前のメソッドでどのようにトレイトを処理できますか?
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
メソッドも取得したい場合はどうすればよいですか?出来ますか?
競合に関する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
を使用してエイリアスを宣言します。