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
因为每个特征都需要自己的默认值。使用 trait 的名称作为属性名称意味着使用类似(new ReflectionClass(__CLASS__))->getTraits())
... 这不是真的很棒。
换句话说,有没有办法用“可覆盖的默认值”创建特征并避免命名冲突?