Vir*_*721 13 php static constructor traits
我想在我的类上链接方法调用,如下所示:
new Obj($args, $if, $any)->foo()->bar();
Run Code Online (Sandbox Code Playgroud)
不幸的是,我必须将结构括在括号内:
(new Obj($args, $if, $any))->foo()->bar();
Run Code Online (Sandbox Code Playgroud)
所以我想有一个特点,我可以在每个我想要能够做的事情的类中重复使用:
Obj::create($args, $if, $any)->foo()->bar();
Run Code Online (Sandbox Code Playgroud)
我希望它是一个特征,所以我的类仍然可以从其他类继承.我来到这一点:
trait Create
{
public static final function create()
{
$reflect = new ReflectionClass(/* self ? static ? Anything else ? */);
return $reflect->newInstanceArgs(func_get_args());
}
}
class Obj
{
use Create;
// ...
}
Run Code Online (Sandbox Code Playgroud)
但似乎特征不处理自我或静态关键字,我不能这样做,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')));
Run Code Online (Sandbox Code Playgroud)
更少的支架深度,更少的错误,更少的时间来解决这些错误,以及更容易阅读的代码,并且在我看来,代码更好看.