如何在PHP5.x中实现方法链接?
我为PHP5.4.x编写了以下类。这应该像我期望的那样工作吗如何在PHP5.x中实现方法链接?,php,method-chaining,Php,Method Chaining,我为PHP5.4.x编写了以下类。这应该像我期望的那样工作吗 class SqlBuilder { private $dbTable; private $action; private $data; private $clause; public function toString() { // $sql = generate sql string // [...] return $sql; }
class SqlBuilder {
private $dbTable;
private $action;
private $data;
private $clause;
public function toString() {
// $sql = generate sql string
// [...]
return $sql;
}
[...]
public function setClause($clause) {
$this->clause = $clause;
}
public function setDbTable($dbTable) {
$this->dbTable = $dbTable;
}
public function setAction($action) {
$this->action = $action;
}
}
$sql = (new \dbal\SqlBuilder())
->setAction($this->action)
->setClause($this->clause)
->setDbTable($this->dbTable)
->toString();
我希望能够访问我的所有setter方法。相反,我看到以下错误:
致命错误:对非对象调用成员函数toString())
这似乎有效:
$builder= new \dbal\SqlBuilder();
$builder->setAction($this->action)
$builder->setClause($this->clause)
$builder->setDbTable($this->dbTable)
$sql = $builder->toString();
但我知道这同样有效:
class Foo
{
public $a = "I'm a!";
public $b = "I'm b!";
public $c;
public function getB() {
return $this->b;
}
public function setC($c) {
$this->c = $c;
return $this;
}
public function getC() {
return $this->c;
}
}
print (new Foo)
->setC($_GET["c"])
->getC(); // I'm c!
我以前在Javascript中使用过这种风格的语法。有没有一种方法可以让它在PHP中工作?您要问的是所谓的方法链接。为了让它按照您想要的方式工作,每个方法调用都需要返回对您正在调用的对象的引用。所以
->setAction($this->action)
// needs to return $this; so that
->setClause($this->clause)
// knows what to operate upon and in turn needs to return $this; so that
->setDbTable($this->dbTable)
// can do the same
尝试:
我不确定我是否理解这个问题。什么是
SqlBuilder
类?我不承认。我真的很失望,这不是一个真正的问题。是的,提问的人很难表达他的问题,但这是一个真正的问题。如果你花时间仔细阅读,我想你会理解他的要求。我已经修改了这个问题,以反映我认为中川所问的。只是一个旁注。。。创建类的实例时,构造函数将返回该类的实例。当您将其分配给一个变量时,您就拥有了对存储在变量中的类的引用,因此当您在对象中调用某个对象时,您是通过它的引用来实现的。在一个类中,$this变量包含相同的引用,因此通过返回$this(如上面的示例所示),您将返回相同的引用,从而使链接成为可能。True。这也保持了它的效率。由于您返回对实例的引用,因此每次调用都不会占用更多内存:)对此不确定-这是因为您仍然在对象的范围内,所以不需要退出然后返回来调用成员函数?这是因为它指向同一内存空间中的对象实例。这就是参考文献。
public function setClause($clause) {
$this->clause = $clause;
return $this;
}
public function setDbTable($dbTable) {
$this->dbTable = $dbTable;
return $this;
}
public function setAction($action) {
$this->action = $action;
return $this;
}