Цепочки методов PHP OOP
Обычно во многих фреймах вы можете найти примеры создания запроса с помощью построителя запросов. Часто вы увидите:
$query->select('field');
$query->from('entity');
Однако в некоторых рамках вы также можете сделать это как
$object->select('field')
->from('table')
->where( new Object_Evaluate('x') )
->limit(1)
->order('x', 'ASC');
Как вы на самом деле делаете такие цепи?
Ответы
Ответ 1
Это называется Fluent Interface - есть пример в PHP на этой странице.
Основная идея заключается в том, что каждый метод (который вы хотите иметь возможность связать) класса должен возвращать $this
-, что позволяет вызывать другие методы этого же класса в возвращаемом $this
.
И, конечно, каждый метод имеет доступ к свойствам текущего экземпляра класса, что означает, что каждый метод может "добавить некоторую информацию" в текущий экземпляр.
Ответ 2
В принципе, вы должны сделать каждый метод в классе возвратом экземпляра:
<?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');
?>
Это часто используется как чистая глазная конфета, но я полагаю, что у нее есть свои действительные обычаи.
Ответ 3
class c
{
function select(...)
{
...
return $this;
}
function from(...)
{
...
return $this;
}
...
}
$object = new c;