PHPのOOPにおけるトレイトのメソッド優先順位
クラスとトレイトに同名のメソッドが存在する場合、 クラスのメソッドがトレイトのメソッドをオーバーライドします:
<?php
trait TestTrait
{
// methodという名前のメソッド:
public function method()
{
return 'trait';
}
}
class TestClass
{
use TestTrait;
// 同じくmethodという名前のメソッド:
public function method()
{
return 'test';
}
}
$test = new TestClass;
echo $test->method(); // 'test' を出力 - クラス自体のメソッドが動作した
?>
クラス自体がそのようなメソッドを持たないが、 トレイトのメソッドと親クラスのメソッドの間で 名前の競合がある場合、トレイトのメソッドが 優先されます:
<?php
trait TestTrait
{
// methodという名前のメソッド:
public function method()
{
return 'trait';
}
}
// 親クラス:
class ParentClass
{
// methodという名前のメソッド:
public function method()
{
return 'parent';
}
}
// クラスは親からmethodメソッドを継承する:
class TestClass extends ParentClass
{
use TestTrait;
}
$test = new TestClass;
echo $test->method(); // 'trait' を出力、トレイトが優先されるため
?>