Метод Цепи PHP ООП - PullRequest
       6

Метод Цепи PHP ООП

12 голосов
/ 21 февраля 2010

Как правило, во многих средах вы можете найти примеры создания запроса с использованием построителя запросов. Часто вы увидите:

$query->select('field');
$query->from('entity');

Однако, в некоторых фреймворках вы можете сделать это так

$object->select('field')
       ->from('table')   
       ->where( new Object_Evaluate('x') )
       ->limit(1) 
       ->order('x', 'ASC');

Как вы на самом деле делаете такие цепочки?

Ответы [ 3 ]

18 голосов
/ 21 февраля 2010

Это называется Свободный интерфейс - на этой странице есть пример в PHP .

Основная идея заключается в том, что каждый метод (который вы хотите иметь возможность связывать) класса должен возвращать $this - что позволяет вызывать другие методы этого же класса в вернулся $this.

И, конечно, каждый метод имеет доступ к свойствам текущего экземпляра класса - это означает, что каждый метод может "добавить некоторую информацию" к текущему экземпляру.

7 голосов
/ 21 февраля 2010

По сути, вы должны заставить каждый метод в классе возвращать экземпляр:

<?php

class Object_Evaluate{
    private $x;
    public function __construct($x){
        $this->x = $x;
    }
    public function __toString(){
        return 'condition is ' . $this->x;
    }
}
class Foo{
    public function select($what){
        echo "I'm selecting $what\n";
        return $this;
    }
    public function from($where){
        echo "From $where\n";
        return $this;
    }
    public function where($condition){
        echo "Where $condition\n";
        return $this;
    }
    public function limit($condition){
        echo "Limited by $condition\n";
        return $this;
    }
    public function order($order){
        echo "Order by $order\n";
        return $this;
    }
}

$object = new Foo;

$object->select('something')
       ->from('table')
       ->where( new Object_Evaluate('x') )
       ->limit(1)
       ->order('x');

?>

Это часто используется как чистый глазной леденец, но я предполагаю, что он также имеет свои действительные применения.

2 голосов
/ 21 февраля 2010
class c
{
  function select(...)
  {
    ...
    return $this;
  }
  function from(...)
  {
    ...
    return $this;
  }
  ...
}

$object = new c;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...