Цепочки метода ООП PHP

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

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

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

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

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

12
задан hakre 25 October 2012 в 20:49
поделиться

3 ответа

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

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

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

18
ответ дан 2 December 2019 в 05:40
поделиться

По сути, вы должны сделать так, чтобы каждый метод в классе возвращал экземпляр:

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

?>

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

7
ответ дан 2 December 2019 в 05:40
поделиться
class c
{
  function select(...)
  {
    ...
    return $this;
  }
  function from(...)
  {
    ...
    return $this;
  }
  ...
}

$object = new c;
2
ответ дан 2 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: