Nikepn911
@Nikepn911
Web-developer

PHP, как решить конфликт множественного использования trait?

Всем доброго дня!
Возник конфликт при инициализации в классе двух трейтов, которые в себе используют еще один и тот же трейт, крашев и фатал эрроров я пока не ловлю (но и полностью еще не тестировал все эти моменты), но IDE ругается на такое использование, и я думаю вполне обоснованно, вот думаю как оптимизировать без глобальной переписи архитектуры проекта.

Детальное объяснение конфликта:
5f195dc251bd9965806226.png
Есть главный класс (родительский), который использует трейт ошибок, есть дочерний класс, наследующий от главного соответственно этот трейт ошибок тоже, и дополнительно использующий свои два трейта (которые внутри себя тоже используют трейт ошибок). При инициализации этих двух трейтов в дочернем классе возникает конфликт:
use OtherFirst, OtherSecond;
IDE пишет - методы трейта ошибок из OtherSecond не будут использоваться в классе, так как уже реализованы в OtherFirst.
P.S. Только по факту наследование от этих двух трейтов (их внутренних трейтов) мне не нужно, так как в родительском классе трейт ошибок уже используется и мне доступен для работы внутри дочерних классов. Вполне вероятно, что я просто усложнил себе жизнь такой архитектурой проекта, но изначально мне казалось я избавлюсь от лишнего и повторяющегося кода (который то и дело проскакивает почти в каждом классе, хотел все минимизировать, разделить по разным файлам классов и трейтов, но вот возникли такие конфликты). Может кто поделится своей идеей и опытом в решении подобных конфликтов и задач.

P.S.2 Мне также уже приходят идеи в голову, вообще трейт ошибок не использовать в других трейтах, но тогда придется писать в каждом трейте один и тот же код для работы с ошибками, а потом инициализировать их уже через главный класс, что не хочется.
  • Вопрос задан
  • 514 просмотров
Решения вопроса 1
@dzhebrak
Как вариант, в 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
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы