我希望能够像下面这样在我的类上进行方法链调用:
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;
// ...
}
但是看起来特质(trait)无法处理self或static关键字,而且我无法执行get_class($this)
,因为这是静态的。有没有明确的方法可以满足我的需求?
谢谢阅读。
编辑:对于那些想知道原因的人,这就是为什么我希望它成为一个特质(trait),而不是一个抽象基类的原因:
$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')));
括号嵌套深度越浅,错误越少,修复这些错误所需的时间也越短,代码阅读起来更容易,并且在我看来,代码看起来更好。