PHP trait 的目标是管理一堆逻辑。但是,使这组逻辑根据一些专用属性工作并避免命名冲突的最佳方法是什么?
我在考虑 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 ? */
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我打算像这样设置 Tree 特性:
trait Tree {
protected $_defaults = array(
'parentFieldname' => 'parent_id',
/*...other options...*/
);
public function moveUp();
public function moveDown();
public function setParent(); …Run Code Online (Sandbox Code Playgroud) 我指的是这篇文章.我基本上创建了一个具有init设置options属性的函数的类.请参阅http://jsbin.com/usaboh/1/edit以获取工作示例(启用控制台以查看输出).
第一个示例下面工作正常,但第二个仍然得到options第一个"实例" 的值.
按预期工作:
var Person = Class.extend({
options: {value: 2},
init: function(options){
if(options) {
this.options = options;
}
}
});
var p = new Person({value: 5});
console.log(p.options); //{"value": 5} (ok)
var p2 = new Person();
console.log(p2.options); //{"value": 2} (ok)
Run Code Online (Sandbox Code Playgroud)
不能按预期工作:
var Person = Class.extend({
options: {value: 2},
init: function(options){
if(options) {
for (var name in options) {
this.options[name] = options[name];
}
}
}
});
var p = new Person({value: …Run Code Online (Sandbox Code Playgroud)