-1

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

すべてのセッターメソッドにアクセスできることを期待しています。代わりに、次のエラーが表示されます。

致命的なエラー:非オブジェクトでのメンバー関数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で動作させる方法はありますか?

4

1 に答える 1

5

あなたが求めているのは、メソッドチェーンと呼ばれるものです。希望どおりに機能させるには、各メソッド呼び出しで、呼び出しているオブジェクトへの参照を返す必要があります。それで、

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

試す :

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;
}
于 2012-10-11T22:45:54.147 に答える