Intereting Posts
Laravel 5 добавление HTML в электронную почту CSS Sprites возвращаются к событию: hover из-за PHP-заявления Красноречивое соединение / отсоединение / синхронизация срабатывает в любом случае? проблема с загрузкой изображений с загрузкой файла php PHP MySQL – раз в неделю Получающий почтовый сервер вставляет пространство перед каждой новой строкой, разбивая множественные / альтернативные Как минимизировать вывод php page html? open dompdf в новой вкладке данные взятые с данной страницы Как запустить это регулярное выражение на PHP, которое анализирует полный адрес электронной почты с именем? LSA – Скрытый семантический анализ – как закодировать его в PHP? API-интерфейс Analytics – Получить данные MCF = пустые результаты Как использовать функцию Unlink () Загрузка файла через FTP с помощью PHP Ошибка при попытке использовать гибридный поток входа в Google OAuth 2.0 (Google_IO_Exception) с сообщением «Ошибка HTTP: невозможно подключиться:« 0 ») почтовых клиентов, поддерживающих формат электронной почты «автоматизированный ярлык» (например: name+label@gmail.com)

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 () для не-объекта"

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