PHP 无需编写大量 return this 的方法链接

PHP Method Chaining without writing lots of return this

我搜索了 PHP 方法链,网上的所有教程都使用 "return $this" 方法链。

是否有神奇的方法或库可用于帮助链接 class 方法,而无需在每个方法的末尾写入 "return $this"。

使用像 phpstrom 这样的工具,并为已经编写了 return $this; 部分的流畅方法制作一个实时模板。然后通过快捷方式使用此模板,例如流利。所以你再也不会为流畅的方法编写方法头、方法体和 return 值。

http://jetbrains.com/help/phpstorm/live-templates.html

祝你有愉快的一天

在语言本身中,没有 return $this 就无法实现这一点。未指定 return 值的函数和方法将在 PHP 中 return null,如此处文档中所述:http://php.net/manual/en/functions.returning-values.php.

由于 null 不是具有可调用方法的对象,当调用链中的下一个项目时将抛出错误。

您的 IDE 可能有一些功能可以使重复性任务更容易完成,例如使用片段或正则表达式查找和替换。但除此之外,该语言本身目前要求你设计你的 class 以流畅地使用链接,或者专门设计它不是。


编辑 1

我想你可以想象使用魔术方法来实现这样的事情 "auto-magically"。我会反对它,因为它是一个糟糕的范例,但这并不意味着你不能让它发挥作用。

我的想法是,您可以使用 __call 魔术方法来包装您的实际方法 (http://php.net/manual/en/language.oop5.overloading.php#object.call)。

<?php

class Whatever
{
    public function __call($method, $parameters)
    {
        //If you're using PHP 5.6+ (http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list)
        $this->$method(...$parameters);

        //If using < PHP 5.6
        call_user_func_array(array($this, $method), $parameters);

        //Always return self
        return $this;
    }

    //Mark methods you want to force chaining on to protected or private to make them inaccessible outside the class, thus forcing the call to go through the __call method
    protected function doFunc($first, $second)
    {
       $this->first = $first;
       $this->second = $second;
    }
}

所以我确实认为这是一种可能性,但我个人确实再次认为,一个神奇的解决方案虽然有效,但会散发出明显的代码气味,这可能会让处理输入变得更好 return $this根据您的设计,您打算允许链接。