Как правило, во многих рамках вы можете найти примеры создания запроса с помощью построителя запросов. Часто вы увидите:
$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;