如何在PHP5.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; }

我为PHP5.4.x编写了以下类。这应该像我期望的那样工作吗

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;
}