В последнее время я познакомился с цепочкой методов, и не уверен, что то, что я здесь делаю, является незаконным, или я делаю это неправильно. У меня есть класс базы данных:
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 , поэтому вы можете связать методы одного и того же объекта с самим собой.