【问题标题】:Chaining a constructor with an object function call in PHP在 PHP 中将构造函数与对象函数调用链接起来
【发布时间】:2009-01-27 08:22:23
【问题描述】:

有谁知道下一个版本的 PHP 是否可以使用以下表达式?

(new A())->a();    // Causes a syntax error

我发现目前必须写 2 行而不是 1 行,这很烦人:

$c = new A();
$c->a();

【问题讨论】:

标签: php


【解决方案1】:

第一个版本不会导致解析错误,它是完全有效的。第二个确实是不可能的,但是你可以通过一些编码标准轻松克服这样的问题。

如果每个团队成员为每个定义的类创建一个与该类同名的函数,并且签名类似于类构造函数的签名,那么您将不会遇到第二个问题。示例:

class Foo
{
    public function __construct($param)
    {}

    public function bar()
    {}
}

/**
 * @return Foo
 */
function Foo($param)
{
    return new Foo($param);
}

Foo()->bar();

当然,你仍然会遇到库代码的问题。

【讨论】:

  • 对,第一个没有问题。我一定把它和别的东西弄混了。我会编辑这个问题。谢谢
  • 我认为您将它与 functionReturnsArray()[3] 混淆了,这确实是不可能的。有提议,但没有被接受。 PHP 内部人员不喜欢这种快捷方式。
  • Iount:你有关于这个讨论的链接吗?这是我非常怀念的一个功能:(
  • 谁能告诉我这是否是 PHP 中的常见习语?人们是否经常这样做,即定义一个返回对象的全局 fn?
【解决方案2】:

new-expression 可以用作函数参数。函数调用可以用作成员访问运算符的左侧。因此,您只需要定义一个函数:

function with($object) { return $object; }

with(new A()) -> a();

每个班级都不需要额外的努力。

【讨论】:

  • 我喜欢这个,虽然如果你还需要一个对象的引用以供以后使用,它最终会有点奇怪。除非您调用的方法返回对对象的引用(例如,特别是可链接的),否则您需要执行with($my_object = new A())->a();。但这是一种绕过限制的新颖方法,谢谢!
【解决方案3】:

从PHP 5.4+ 开始,这是可能的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多