Цепочки методов PHP OOP

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

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

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

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

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

Это называется Fluent Interface – в PHP есть пример на этой странице.

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

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

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

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

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

 class c { function select(...) { ... return $this; } function from(...) { ... return $this; } ... } $object = new c;