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
根据您的设计,您打算允许链接。
我搜索了 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
根据您的设计,您打算允许链接。