PHP方法链接没有写很多回报这个

时间:2017-04-11 14:43:17

标签: php methods chaining

我搜索了PHP方法链,并且网上提供的所有教程都使用“return $ this”进行方法链接。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

编辑1

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

我的想法是你可以使用__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在哪里打字打算,根据您的设计,允许链接。

答案 1 :(得分:0)

使用像phpstrom这样的工具,为已经写好return $this;部分的流畅方法制作一个实时模板。然后通过快捷方式使用此模板流利。因此,您永远不会再为Fluent方法编写方法标题,正文和返回值。

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

度过愉快的一天