我最近被介绍了方法链接,不确定我在这里做的是非法的,还是我做错了。我有一个数据库类:
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
返回自身,因此可以将同一对象的方法链接到自身上。