13

我想在我的类上链接方法调用,如下所示:

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')));

更少的括号深度,更少的错误和修复这些错误所需的时间更少,加上更易于阅读的代码,并且在我看来,更好的代码。

4

3 回答 3

12

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

于 2013-03-15T23:05:48.580 回答
0

我不明白你为什么不想使用括号——它并不是世界上最糟糕的语法(事实上,我认为从视觉角度来看,它比你想要替换它的双冒号语法更好和)

但是,如果您确实想在所有类上都有这样的工厂方法,为什么不创建一个基类,所有其他类都从该基类扩展定义该create方法呢?我不认为你需要一个特质。

class BaseClass {
    public function create() {
        ...
    }
}

然后extends BaseClass是你还没有的所有其他课程extends

于 2013-03-15T23:15:37.210 回答
-2

Traits是 PHP 中的一个新特性。此功能在 5.4 版本中引入。这是 PHP 中多重继承的替代品

例子:

trait Net
{
    public function net()
    {
        return 'Net';
    }
}

trait Tuts
{
    public function tuts()
    {
        return 'Tuts';
    }
}

class NetTuts
{
    use Net, Tuts;
    public function plus()
    {
        return 'Plus';
    }
}

$o = new NetTuts;
echo $o->net(), $o->tuts(), $o->plus();

输出是:NetTutsPlus

echo (new NetTuts)->net(), (new NetTuts)->tuts(), (new NetTuts)->plus();

输出是:NetTutsPlus

在对象 $o 的帮助下,我们可以访问特征函数值..

于 2014-07-19T16:24:50.040 回答