Подтвердить что ты не робот

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

Обычно во многих фреймах вы можете найти примеры создания запроса с помощью построителя запросов. Часто вы увидите:

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

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

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

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

4b9b3361

Ответ 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;