链接方法一起调用

时间:2012-10-21 20:54:00

标签: php methods method-chaining

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

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


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

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

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

您可以发布使用这些记录的简单示例吗?

2 个答案:

答案 0 :(得分:4)

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

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

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

  1. 失去了可读性。
  2. 失去在两者之间使用对象的能力。
  3. 失去检查错误的能力,并且您指望的方法可以返回您认为的错误。

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

    此外,PDO::query()可能会在出现错误的情况下返回 BOOLEAN false ,这会导致无法解释的“方法fetchAll()在非对象“错误。

答案 1 :(得分:4)

一个简单的例子:

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();