PHP方法链接混乱

时间:2012-01-17 03:08:16

标签: php

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

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

有人可以向我解释我在这里做错了什么,因为它与使用方法链接有关。谢谢。

4 个答案:

答案 0 :(得分:5)

query()中,您需要返回$this,否则在函数返回时没有任何内容可以链接

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

答案 1 :(得分:2)

如果您想使用方法链,您应该做的是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();

答案 2 :(得分:2)

Introducing Method Chaining: 要在前面的示例中启用方法链接,我们只需要在每个“setXXX”中添加一行代码。功能。那段代码返回$ 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();

答案 3 :(得分:1)

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

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

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

someFunction()->someMethod();

->someMethod()只适用于someFunction返回的任何值。

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