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; // ... } |
但似乎特征不能处理自我或静态关键字,而且我不能处理
谢谢你的阅读。
编辑:对于那些想知道的人,这就是为什么我希望它是一个特性而不是抽象的基类:
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'))); |
括号深度越小,错误就越少,修复这些错误所需的时间就越短,加上代码更容易阅读,在我看来,代码的外观就越好。
是的,有一个叫
我不明白你为什么不想使用方括号——这并不是世界上最糟糕的语法(事实上,我认为从视觉上看,它比你想用的双冒号语法更好)
但是,如果您希望在所有类上都有这样的工厂方法,为什么不创建一个基础类,您的所有其他类都从这个基础类扩展来定义
1 2 3 4 5 | class BaseClass { public function create() { ... } } |
然后所有其他类的
特性是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的帮助下,我们可以访问特征函数值。