【问题标题】:Is there a way to chain php methods while also returning something?有没有办法在返回一些东西的同时链接 php 方法?
【发布时间】:2013-11-03 00:41:33
【问题描述】:

我有一个名为 getPropertyValue($object, $property) 的递归定义函数,如果 $property 在 $object 的任意深度不存在则返回 false,否则返回与 $object 中找到的第一个 $property 对应的值.它本质上是PHP内置函数property_exists()的通用版本

我想让这个方法可链接,并且我知道要做到这一点,我只需在方法中返回对类实例 ($this) 的引用,但如上所述,我已经返回了值对应于在 $object 中找到的第一个 $property。

我怎样才能使这个方法可以链接,同时仍然返回这个值?我在想一种可能性是返回一个同时包含 $this 和该属性/false 值的对象,如果它分别找到/未找到。这是一种可行的方法吗?在这种情况下,实现可链接性的最佳方式是什么?

非常感谢。

【问题讨论】:

  • How do I chain methods in PHP? 的可能重复项
  • 你返回假。链接意味着继续;如果一个方法返回 false,那么如果失败了,为什么还要继续并返回另一个值?

标签: php recursion chaining


【解决方案1】:

当您想要返回数据时,这种 API 并不真正起作用。

方便构建复杂的对象,可以使用更少的样板代码执行许多方法。这些方法往往以描述性的方式命名,以便很好地了解正在执行的操作。

一个例子是“查询构建器”模式,通过链式方法构建 SQL 语句。

$sql = $qb->select()->from('table')->where()->field('foo')->equals('bar');

不过,不要上当,这只是让您免于使用 setter。

$qb->setSelect();
$qb->setFrom('table');
$qb->setField('foo');  
$qb->setEquals('bar');

显然您没有创建查询构建器,并且同一 API 有不同的实现,但关键是它们都向对象添加数据而不是返回数据。

【讨论】:

    【解决方案2】:

    你可以通过将它们放入一个数组来返回多个值:

    return array($value,$this); // so you return both.
    

    【讨论】:

    • 是的,但在问题的上下文中,这很草率。他们期望将方法链接到一个最终结果或得到错误。我们是否应该编写代码以接受来自所有方法的数组,以防链中的某些内容为假但我们仍然想要一些值?
    • 好的,那么你必须采取另一种方法:只返回 $this 并让函数将其结果写入外部关联数组,如果找到键名 = 属性名,值 = 属性值,否则返回 false .然后在函数完成工作后检查数组。
    猜你喜欢
    • 2011-11-15
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多