创建和访问嵌套对象和函数


Creating and accessing nested objects & functions?

>我有一个类函数,可以像这样查询数据:

// Disclaimer: (None of the following is "real")
class Mockup {
  function getData() {
    query("SELECT id,name FROM pages")
    // Results: $id = 1, $name = "Math Text Book: Grade 7"
  }
}

虽然我希望能够访问这两个值(即 $id 和 $name),但我只能单独返回一个值(因此与简单地在类外查询相比,这是一个缺点)。

上面的示例代码结合使用是否可以遵循以下内容?

$test = new Mockup;
echo $test->getData()->id; // Echos "7"

同样,我在各种软件(如MediaWiki)中看到了以下内容:

$test = new Mockup;
echo $test->getData()->getId(); // Echos "7"

这是否表明也可以嵌套函数?

这不是一个嵌入式函数,而是方法链。当一个方法返回类实例时,你可以使用它立即使用另一个类成员(var 或函数),从而将它们链接在一起。

class Mockup {
  public $id;
  public $name;
  function getData() {
    $data = query();
    $this->id = $data->id;
    $this->name = $data->name;
    return $this; // return the instance for chaining
  }
  function getId() {
    return $this->id;
  }
  function getName() {
    return $this->name;
  }
}
$mockup = new Mockup();
//unchained
$mockup->getData();
$id = $mockup->getId();
$name = $mockup->getName();
// or
$id = $mockup->id;
$name = $mockup->name;
//chained
$id = $mockup->getData()->getId();
$name = $mockup->getData()->getName();
//or
$id = $mockup->getData()->id;
$name = $mockup->getData()->name;

如果要同时返回两者,只需返回包含这些值的数组或对象即可。

仅供参考:使用链接时,您不必返回要从中调用该方法的类的实例,您也可以在该方法中创建另一个类的新实例并返回该实例,以便您可以从该实例调用成员,例如:

$garage->getVehicle('plane')->fly(); // returns new Plane() with specific methods
$garage->getVehicle('car')->drive(); // returns new Car() with specific methods