我最近被介绍过方法链,我不确定我在这里做的是非法的,或者我做错了。我有一个数据库类,如:
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()”
有人可以向我解释我在这里做错了什么,因为它与使用方法链接有关。谢谢。
答案 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
返回自身,因此您可以链接同一对象的方法。