В последнее время я познакомился с цепочкой методов, и не уверен, что то, что я здесь делаю, является незаконным, или я делаю это неправильно. У меня есть класс базы данных:
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 () для не-объекта"
Может кто-нибудь, пожалуйста, объясните мне, что Im делает здесь неправильно, поскольку это связано с использованием цепочки методов. Спасибо.
В 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. И этот код возвращает $ this ;. Теперь наш класс выглядит так:
class Person { private $name; private $age; public function setName($Name) { $this->name = $Name; return $this;//Returns object of 'this' ie Person class } public function setAge($Age) { $this->age = $Age; return $this;//Again returns object of 'this' ie 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, поэтому мы можем получить доступ к классу Person, используя $myself->setName('Arvind Bhardwaj')
в качестве объекта.
Теперь мы устанавливаем возраст как $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();
->someMethod()
просто работает над тем, какое значение возвращает someFunction
.
Поэтому для использования цепочки методов вам нужно вернуть объект из ваших методов. Объект также может вернуть себя с return $this
, поэтому вы можете связать методы одного и того же объекта с самим собой.