2010-02-21 4 views
12

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

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

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

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

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

ответ

18

Это называется Fluent Interface - есть example in PHP на этой странице.

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

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

+0

Добро пожаловать :-) ;; да, каждый метод может устанавливать/изменять свойства, а «последний» метод часто используется для «выполнения» всех предыдущих методов, которые вызывались для настройки. –

+0

Не уверен, что использование свободного интерфейса всегда сделает код более удобным для чтения ;;; например, когда он используется для создания некоторого SQL-запроса, это имеет смысл; но когда методы на самом деле не связаны, не так уверен - зависит от ситуации, я полагаю ;;; что даже если ваши методы возвращают '$ this', их можно назвать« обычным способом ». –

+0

Нужно ли возвращать '$ this'? Не может ли он возвратить '$ это' и продолжить оттуда? –

2
class c 
{ 
    function select(...) 
    { 
    ... 
    return $this; 
    } 
    function from(...) 
    { 
    ... 
    return $this; 
    } 
    ... 
} 

$object = new c; 
7

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

<?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'); 

?> 

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

+0

Использование case: '$ setup = $ Object-> add_component ($ component_property) -> configure ($ component_properties);' Where Object :: add_component() возвращает объект Component, который он добавил как свойство $ Object (например, к массив), и он настроен с помощью метода Component :: configure(). Без цепочки мы должны были бы определить, что последний элемент добавлен в массив $ Object-> Components, а затем получить объект Component таким образом. – AVProgrammer

+0

@AVProgrammer - Ваш пример не использует 'return $ this', не так ли? –

+0

Да, это делает объект Component, чтобы разрешить метод configure(). – AVProgrammer