Как вариант, в OtherFirstTrait и OtherSecondTrait можно не использовать ErrorTrait, а сделать абстрактный метод с той же сигнатурой, что и в ErrorTrait. В ChildClass в свою очередь использовать ErrorTrait, OtherFirstTrait, OtherSecondTrait.
Пример:
trait ErrorTrait
{
public function someMethod($someArg) {
echo __TRAIT__ . ": " . $someArg . "\n";
}
}
trait OtherFirstTrait
{
abstract public function someMethod($someArg);
public function someMethod1($someArg) {
echo __TRAIT__ . ": " . $someArg . "\n";
$this->someMethod($someArg);
}
}
trait OtherSecondTrait
{
abstract public function someMethod($someArg);
public function someMethod2($someArg) {
echo __TRAIT__ . ": " . $someArg . "\n";
$this->someMethod($someArg);
}
}
abstract class MainClass
{
use ErrorTrait;
}
class ChildCLass extends MainClass
{
use OtherFirstTrait, OtherSecondTrait;
}
$o = new ChildCLass();
$o->someMethod("test ErrorTrait");
print("\n");
$o->someMethod1("test OtherFirstTrait");
print("\n");
$o->someMethod2("test OtherSecondTrait");
Вывод:
ErrorTrait: test ErrorTrait
OtherFirstTrait: test OtherFirstTrait
ErrorTrait: test OtherFirstTrait
OtherSecondTrait: test OtherSecondTrait
ErrorTrait: test OtherSecondTrait