我想在我的类上链接方法调用,如下所示:
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')));
更少的括号深度,更少的错误和修复这些错误所需的时间更少,加上更易于阅读的代码,并且在我看来,更好的代码。