PHPのOOPにおけるトレイトのメソッド優先順位

クラスとトレイトに同名のメソッドが存在する場合、 クラスのメソッドがトレイトのメソッドをオーバーライドします:

php<?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<?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' を出力、トレイトが優先されるため
?>