PHP 5.4 - 特征和自我/静态

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)

更少的支架深度,更少的错误,更少的时间来解决这些错误,以及更容易阅读的代码,并且在我看来,代码更好看.

Fab*_*ler 12

是的,有get_called_class(),这正是你想要的.