【发布时间】:2013-03-04 19:40:44
【问题描述】:
我想在我的类上链接方法调用,如下所示:
new Obj($args, $if, $any)->foo()->bar();
不幸的是,我必须将结构括在括号内:
(new Obj($args, $if, $any))->foo()->bar();
所以我想拥有一个可以在每个班级重复使用的特质,我希望能够做类似的事情:
Obj::create($args, $if, $any)->foo()->bar();
我希望它成为一个特征,这样我的类仍然可以从其他类继承。 我已经到了这一点:
trait Create
{
public static final function create()
{
$reflect = new ReflectionClass(/* self ? static ? Anything else ? */);
return $reflect->newInstanceArgs(func_get_args());
}
}
class Obj
{
use Create;
// ...
}
但似乎特质不处理 self 或 static 关键字,我不能这样做 get_class($this) 因为这是静态的。
请问有什么明确的方法可以做我想做的事吗?
感谢阅读。
编辑:对于那些想知道的人,这就是为什么我希望它成为一个特征而不是抽象基类:
$database = (new Database())
->addTable((new Table())
->addColumn((new Column('id', 'int'))
->setAttribute('primary', true)
->setAttribute('unsigned', true)
->setAttribute('auto_increment', true))
->addColumn(new Column('login', 'varchar'))
->addColumn(new Column('password', 'varchar')));
$database = Database::create()
->addTable(Table::create()
->addColumn(Column::create('id', 'int')
->setAttribute('primary', true)
->setAttribute('unsigned', true)
->setAttribute('auto_increment', true))
->addColumn(Column::create('login', 'varchar'))
->addColumn(Column::create('password', 'varchar')));
括号深度更少,错误更少,修复这些错误所需的时间更少,而且代码更易于阅读,而且在我看来,代码看起来更好。
【问题讨论】:
-
使用括号到底有什么问题??
-
减少括号的数量可以减少因忘记其中一个而犯错的可能性以及修复错误所需的时间,并使代码更易于阅读和理解。
-
嗯,好吧,老实说,我想说带括号的代码是完全可读的,特别是如果你使用的是一个不错的 IDE。但各有各的。 :-)
标签: php static constructor traits