2012-01-17 3 views
0

Я недавно познакомился с цепочкой методов и не уверен, что то, что я здесь делаю, является незаконным, или я делаю это неправильно. У меня есть база данных класса, как:PHP Метод chaining Confusion

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 делает неправильно здесь, поскольку оно связано к использованию метода цепочки. Спасибо.

+0

возможно дубликат (http://stackoverflow.com/questions/3724112/php-method-chaining) – mario

ответ

5

В query(), вам нужно вернуться $this иначе ничего не приковать его с, когда функция возвращает

public function query($query) 
{ 
    $this->last_query = $query; 
    $this->resultset = mysql_query($query, $this->connection); 
    return $this; // <- here 
} 
+0

Большое спасибо –

+0

Добро пожаловать. – Ben

2

Если вы хотите использовать метод chaining, то вам следует сделать это 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(); 
1

Метод формирования цепочки произведений возвращая объект из функции.

$obj = someFunction(); 
$obj->someMethod(); 

someFunction возвращает объект, который имеет метод someMethod, который вы можете позвонить. Очень простой материал. Вы можете написать это, без явного хранения возвращаемого объекта в переменной:

someFunction()->someMethod(); 

->someMethod() просто работает на любое значение someFunction возвращается.

Чтобы использовать метод chaining, вам необходимо вернуть объект из ваших методов. Объект также может вернуть себя с return $this, поэтому вы можете цеплять методы одного и того же объекта на себя.

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, поэтому мы можем получить доступ к классу Person с помощью $myself->setName('Arvind Bhardwaj') в качестве объекта.

Теперь мы установили возраст $myself->setName('Arvind Bhardwaj')->setAge('22'). setAge() снова возвращает объект этого класса, поэтому полная фраза $myself->setName('Arvind Bhardwaj')->setAge('22') теперь является объектом Person.

Наконец мы выводим информацию о пользователе, обращаясь findMe метод, как: [? Метод PHP цепочки]

$myself->setName('Arvind Bhardwaj')->setAge('22')->findMe(); 
Смежные вопросы