У меня есть вариант использования этого, который я предпочитаю. Я часто буду писать черты, предназначенные для соблюдения определенного интерфейса, хотя, поскольку черты не могут напрямую реализовать интерфейс, я укажу, какой интерфейс удовлетворяет черта в комментарии блока doc, а также префикс защищенных и частных методов, которые не связаны с интерфейсом с одним подчеркиванием. Это позволяет довольно легко отслеживать, какие методы предоставляются для удовлетворения контракта (интерфейса), а какие являются вспомогательными методами. Например:
interface Foo {
public function bar(array $args = null, array $flags = null);
}
Черта, указанная ниже, предназначена для удовлетворения требований интерфейса Foo
, но для этого требуется только один из его методов. Для ясности защищенные методы имеют префикс. Даже если они будут обнародованы позднее, это все равно означает, что они не зависят от контракта от интерфейса и не должны рассматриваться как имеющие отношение к делу.
/**
* @satifies Foo
*/
trait FooTrait {
public function bar(array $args = null, array $flags = null) {
$this->_handleArgs($args);
$this->_handleFlags($flags);
}
protected function _handleArgs(array $args = null) {
if (is_null($args) {
return;
}
//do something with the args
}
protected function _handleFlags(array $flags = null) {
if (is_null($flags) {
return;
}
//do something with the flags
}
}
После этого вы можете удовлетворить интерфейс, реализовав его в классе и используя соответствующую черту без дополнительной работы.
final class ConcreteFoo implements Foo {
use FooTrait;
}
Это обеспечивает очень слабую взаимосвязь и позволяет довольно легко интегрироваться с другими классами из других библиотек или сред, которым требуется цепочка наследования, без необходимости замыкать логику с кучей классов адаптеров.
Моя IDE (Netbeans) ворчит по этому поводу как нарушение PSR-1. Поскольку PSR-1 напрямую не влияет на выполнение, и можно поспорить о том, является ли этот подход более читабельным или нет, мне действительно было бы все равно. Я стараюсь следовать всем PSR, которые напрямую влияют на исполнение.