关于PHP 5.4:PHP 5.4 – 特征和自我/静态

PHP 5.4 - Traits and self / static

我希望按如下方式在类上链接方法调用:

1
new Obj($args, $if, $any)->foo()->bar();

不幸的是,我必须将结构括在括号内:

1
(new Obj($args, $if, $any))->foo()->bar();

所以我想有一个我可以在我想做的每一个类中重用的特性:

1
Obj::create($args, $if, $any)->foo()->bar();

我希望它是一个特性,这样我的类仍然可以从其他类继承。我已经说到这点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
trait Create
{
    public static final function create()
    {
        $reflect = new ReflectionClass(/* self ? static ? Anything else ? */);
        return $reflect->newInstanceArgs(func_get_args());
    }
}

class Obj
{
    use Create;

    // ...
}

但似乎特征不能处理自我或静态关键字,而且我不能处理get_class($this),因为这是静态的。有没有明确的方法来做我想做的事?

谢谢你的阅读。

编辑:对于那些想知道的人,这就是为什么我希望它是一个特性而不是抽象的基类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$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')));

括号深度越小,错误就越少,修复这些错误所需的时间就越短,加上代码更容易阅读,在我看来,代码的外观就越好。


是的,有一个叫get_called_class(),它完全满足你的需要。


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

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

1
2
3
4
5
class BaseClass {
    public function create() {
        ...
    }
}

然后所有其他类的extends BaseClass,在那里你还没有extends


特性是PHP中的一个新特性。此功能在5.4版中介绍。这是PHP中多重继承的替代

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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();

输出为:nettusplus

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

输出为:nettusplus

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