【问题标题】:Chaining method calls together将方法调用链接在一起
【发布时间】:2012-10-21 20:54:00
【问题描述】:

例如这样的记录:property3->property2->property1对我来说是理解的,这意味着类的属性,是另一个类的对象,例如:

class a {
        public $property1 = "some";
}


class b {
    function __construct () {
        $this->property2 = new a();
    }           
}

$obj = new b();
echo $obj->property2->property1;

这明白了。但我无法理解这样的记录:method1()->method2()->method3()

你能发布简单的例子,谁在使用这些记录?

【问题讨论】:

  • 这些方法由return $this;完成。
  • @Ninsuo:并非总是如此。这些方法返回一个对象,不一定是调用它们的同一个对象。

标签: php methods method-chaining


【解决方案1】:

一个简单的例子:

class A {

  function fooA() {
    echo "a...";
    return $this;
  }

  function fooB() {
    echo "b...";
    return $this;
  }

  function fooC() {
   echo "c...";
  }
}

$a = new A();
$a->fooA()->fooB()->fooC();

或者有几个类:

class A
{
  private $b;

  public function __construct()
  {
    $this->b = new B();
  }

  public function fooA()
  {
    echo "A...";
    return $this->b;
  }

}

class B
{

  public function fooB()
  {
    echo "B...";
  }

}

$a = new A();
$a->fooA()->fooB();

【讨论】:

  • 再次,您给出的图片不完整。方法并不总是返回 $this 并且它可以神奇地链接。
【解决方案2】:

表示这些函数返回对象。例如,以下是可能的(假设 $pdo 是一个有效的 PDO 对象):

$result = $pdo->query("SELECT * FROM `table`")->fetchAll();

这可能并不总是有利的,因为你:

  1. 失去可读性。
  2. 失去使用中间物体的能力。
  3. 失去检查错误的能力,您指望方法返回您认为的内容。

    在本例中,您只能以array 的形式获得结果集,但您无法访问PDO::query() 返回的PDOStatement。在这种情况下,它可能无关紧要,在某些情况下可能。

    此外,PDO::query() 可能会在出现错误时返回 BOOLEAN false,这将给出无法解释的“Method fetchAll() used on an non-object”错误。 p>

【讨论】:

  • 另一个潜在问题是,如果 query() 执行失败并返回错误布尔值而不是对象...抛出异常的有力论据
  • @MarkBaker:好吧,如果我们详细说明,你应该启用PDOExceptions :)
  • @MarkBaker 方法链中出了点问题确实是我一开始就不会使用它的原因。这不仅与 pdo 有关,而且在一般情况下。 +1
  • @Madara - 只是为了未来读者的利益而指出,他们可能不会考虑这种可能性,或者考虑在其他代码中使用流畅的界面......但是如果使用得当,流畅的界面可能会非常强大而简单
猜你喜欢
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
相关资源
最近更新 更多