如何在新创建的对象上链接方法?

aef*_*fxx 55 php constructor new-operator method-chaining

我想知道是否有办法在PHP中新创建的对象上链接方法?

就像是:

class Foo {
    public function xyz() { ... return $this; }
}

$my_foo = new Foo()->xyz();
Run Code Online (Sandbox Code Playgroud)

有人知道实现这个目标的方法吗?

Ala*_*orm 99

在PHP 5.4+中,解析器已被修改,因此您可以执行此类操作

(new Foo())->xyz();
Run Code Online (Sandbox Code Playgroud)

将实例化包装在括号中,然后链接掉.

在PHP 5.4之前,当你使用的时候

new Classname();
Run Code Online (Sandbox Code Playgroud)

语法,你不能链接实例化的方法调用.这是PHP 5.3语法的限制.实例化对象后,您可以链接掉.

我以前看到过的一种解决方法是某种静态实例化方法.

class Foo
{
    public function xyz()
    {
        echo "Called","\n";
        return $this;
    }

    static public function instantiate()
    {
        return new self();
    }
}


$a = Foo::instantiate()->xyz();
Run Code Online (Sandbox Code Playgroud)

通过在静态方法中将调用包装到new,您可以使用方法调用实例化一个类,然后您可以自由地链接它.

  • 当提问者似乎没有沉浸在CS文化中时,我更倾向于将OO术语从答案中删除.他们更好地学习这个概念,然后通过其"适当"的名称来识别它,而不是被新术语所吓倒. (6认同)
  • 如果你打算使用静态实例化方法,你应该让它调用"new static"而不是"new self".这样,如果你在Foo的子类上调用它,它将创建子类的实例,而不是Foo本身. (3认同)
  • +1是的我打算回答"使用工厂方法",这基本上就是你所展示的. (2认同)
  • 嗯,是吗?我所谈论的"构造函数问题"是无法实例化对象并立即链接,是的,有与继承相关的权衡以及您正在使用哪个版本的PHP w/r/t静态绑定. (2认同)

Ken*_*iah 23

定义这样的全局函数:

function with($object){ return $object; }
Run Code Online (Sandbox Code Playgroud)

然后您就可以致电:

with(new Foo)->xyz();
Run Code Online (Sandbox Code Playgroud)

  • 我个人更喜欢Alan的答案,它可以很容易地在框架的基类中实现,因此可以在一个地方解决问题,而不必在每个类中实现Alan的答案!我喜欢DRY编程!! (3认同)
  • 这也称为[身份功能](https://en.wikipedia.org/wiki/Identity_function),有些库将其命名为`id()`.由于它的语法和解析器,它在PHP中有很多用处. (2认同)

Jac*_*son 11

在PHP 5.4中,您可以链接一个新实例化的对象:

http://docs.php.net/manual/en/migration54.new-features.php

对于旧版本的PHP,您可以使用Alan Storm的解决方案.


Ing*_*nix 6

这个答案已经过时了 - 因此想要纠正它.

在PHP 5.4.x中,您可以将方法链接到新调用.我们以这个类为例:

<?php class a {
    public function __construct() { echo "Constructed\n"; }
    public function foo() { echo "Foobar'd!\n"; }
}
Run Code Online (Sandbox Code Playgroud)

现在,我们可以使用这个: $b = (new a())->foo();

输出是:

Constructed
Foobar'd!
Run Code Online (Sandbox Code Playgroud)

更多信息可在手册中找到:http://www.php.net/manual/en/migration54.new-features.php