PHP トレイトの目的は、一連のロジックを管理することです。しかし、いくつかの専用プロパティに従って、この一連のロジックを機能させ、名前の競合を回避するための最良の方法は何ですか?
MVC、特にモデル クラスについて考えています。実際、モデルは特性の良い候補のようです。モデルは、ツリー構造を実装したり、ドラフト可能、改訂可能、スラッグ可能などにすることができます。
私はこのようなものを書きたいと思います:
class MyModel extends Model {
use Tree, Revision, Slug;
protected $_behaviors = array(
'Tree' => array('parentFieldname' => 'p_id'),
'Revision' => array(/* some options */),
'Slug' => array(/* some options */)
);
public function __construct() {
foreach($this->_behaviors as &$options) {
$options += /* trait defaults ? */
}
}
}
Tree トレイトを次のように設定する場合:
trait Tree {
protected $_defaults = array(
'parentFieldname' => 'parent_id',
/*...other options...*/
);
public function moveUp();
public function moveDown();
public function setParent(); //<- need the `'parentFieldname' => 'p_id'`attribute
/*...and so on...*/
}
$_defaults
各特性には独自のデフォルトが必要なため、名前の競合が発生します。特性の名前をプロパティ名として使用することは、(new ReflectionClass(__CLASS__))->getTraits())
... のようなものを使用することを意味しますが、これは本当に素晴らしいことではありません。
言い換えれば、「オーバーライド可能なデフォルト」で特性を作成し、名前の競合を回避する方法はありますか?