【问题标题】:Call function directly after constructor: new Object()->callFunction()构造函数后直接调用函数:new Object()->callFunction()
【发布时间】:2013-09-23 06:40:47
【问题描述】:

正如您在标题中看到的那样,我的编程背景是 Java。在 Java 中你可以做这样的事情

new Object().callSomeMethod();

无需将创建的 Object 分配给变量,如果您只需要此 Object 一次,则编码非常有用且清晰。

现在在 PHP 中我尝试做同样的事情

new Object()->callSomeMethod();

但在这里我得到一个'解析错误:语法错误,意外'->'(T_OBJECT_OPERATOR)'。

有没有办法在 PHP 中做到这一点?

【问题讨论】:

  • 仅在 PHP >= 5.4 例如echo (new DateTime())->format('d-M-Y');
  • 声明方法静态? Object::callSomeMethod();
  • @MarkBaker 不。我在 5.4 中见过
  • Static 不是一个选项,它必须是一个对象 :) @MarkBaker 谢谢,这就是我搜索的内容
  • @Basti - 接受 Kita 的回答,因为他给出了正确的解决方案

标签: php function class constructor call


【解决方案1】:
(new Object())->callSomeMethod();

将在 PHP 5.4+ 中工作

编辑

这是在 PHP 5.4 上添加的new feature

已添加实例化时的类成员访问权限,例如(new Foo)->bar()

EDIT2

PHP feature RFC 提出了两组语法(带 & 不带括号),它们都在 RFC 中实现,但只发布了一个。我找不到解释该决定的链接。

让我们看一下 RFC 中的无括号语法示例:

  • new foo->bar() 应读作(new foo)->bar()
  • new $foo()->bar 应读作(new $foo())->bar
  • new $bar->y()->x 应读作 (new ($bar->y)())->x

我认为没有提供无括号语法是因为它建议的解析优先级不是很直观(肉眼难以理解),如第三个示例所示。

【讨论】:

  • 为什么PHP不允许OP提到的语法?
  • 您能否提供有关为什么需要括号的信息?根据运算符优先级列表,new 具有最高优先级,但 -> 在此列表中没有出现...
  • 谢谢,但这并不能解决我的问题,为什么需要括号。
猜你喜欢
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
相关资源
最近更新 更多