PHP方法链接混乱


PHP Method chaining Confusion

我最近被介绍了方法链接,不确定我在这里做的是非法的,还是我做错了。我有一个数据库类:

    class Database
    {
    private $connection;
    private $resultset, $last_query, $current_row;
    function __construct()
    {
        $this->connect();
    }
    public function connect()
    {
        // Connect to the database
    }
    public function query($query)
    {
        $this->last_query = $query;
        $this->resultset = mysql_query($query, $this->connection);
    }
    public function fetchObject()
    {
        $this->current_row = mysql_fetch_object($this->resultset);
        return $this->current_row;
    }
}

我试着像一样使用它

$db->query("SELECT * FROM users WHERE name='JimmyP'")->fetchObject();

我也试过

$db->fetchObject()->query("SELECT * FROM users WHERE name='JimmyP'");

但我得到了错误:"在非对象上调用成员函数fetchObject()"

有人能向我解释一下我在这里做错了什么吗,因为这与使用方法链接有关。非常感谢。

query()中,您需要返回$this,否则当函数返回时,没有任何东西可以链接它

public function query($query)
{
   $this->last_query = $query;
   $this->resultset = mysql_query($query, $this->connection);
   return $this;  // <- here
}

如果您想使用方法链接,您应该使用return $this

public function query($query)
{
    $this->last_query = $query;
    $this->resultset = mysql_query($query, $this->connection);
    return $this;
}

然后你可以这样做:

$db->query("SELECT * FROM users WHERE name='JimmyP'")->fetchObject();

介绍方法链接:为了在前面的例子中启用方法链接,我们只需要在每个"setXXX"函数中添加一行代码。这个代码是return$this;。现在我们的课看起来像:

class Person
{
    private $name;
    private $age;
    public function setName($Name)
    {
        $this->name = $Name;
        return $this;//Returns object of 'this' i.e Person class
    }
    public function setAge($Age)
    {
        $this->age = $Age;
        return $this;//Again returns object of 'this' i.e Person class
    }
    public function findMe()
    {
        echo "My name is ".$this->name." and I am ".$this->age. " years old.";
    }
}

现在让我们通过方法链接来访问我们的类方法:

$myself = new Person();
$myself->setName('Arvind Bhardwaj')->setAge('22')->findMe();

概念解释:

你肯定对这里到底发生了什么有点困惑。让我们以一种简单的方式浏览一下这段代码。在此之前,请记住方法链接总是从左到右工作!

$myself = new Person()创建了一个Person类的新对象,这很容易猜测。

接下来,$myself->setName('Arvind Bhardwaj')将名称分配给一个变量,并返回同一类的对象。

现在$myself->setName('Arvind Bhardwaj')已经成为Person类的对象,所以我们可以使用$myself->setName('Arvind Bhardwaj')作为对象来访问Person类。

现在我们将年龄设置为$myself->setName('Arvind Bhardwaj')->setAge('22')setAge()再次返回该类的对象,因此完整短语$myself->setName('Arvind Bhardwaj')->setAge('22')现在是Person的对象。

最后,我们通过访问findMe方法将用户信息打印为:

$myself->setName('Arvind Bhardwaj')->setAge('22')->findMe();

方法链接通过从函数返回对象来工作。

$obj = someFunction();
$obj->someMethod();

someFunction返回一个具有方法someMethod的对象,您可以调用该方法。非常简单的东西。您可以这样写,而无需将返回的对象显式存储在变量中:

someFunction()->someMethod();

CCD_ 14只是对CCD_ 15返回的任何值进行操作。

因此,要使用方法链接,需要从方法中返回一个对象。对象也可以使用return $this返回自身,因此可以将同一对象的方法链接到自身上。