Объединение методов PHP в цепочки или текучий интерфейс

Laravel
1 мин. на чтение

Одним из интереснейших наблюдений, которое я вижу в нашей студии – junior разработчик вполне способен использовать текучий интерфейс, например в кодинге на Laravel часто встречается код для получения коллекций данных:

$values = ValueModel::with['otherValue']->whereId(1)->whereSlug('slug')->orderBy('id')->get()->toArray();

Но объяснить как это работает он еще не способен, в т.ч. воспроизвести на каком-то простом примере. Давайте создадим такой пример. Им будет обычный калькулятор. Рассмотрим для начала пример без текучего интерфейса:

<?php

class Calculate {
    
    
    private $value;
    
    public function __construct($value)
    {
        $this->value = $value;
    }
    
    public function add($item)
    {
        $this->value = $this->value + $item;
        
    }
    
    public function remove($item)
    {
        $this->value = $this->value - $item;
        
    }
    
    public function multiply($item)
    {
        $this->value = $this->value * $item;   
        
    }
    
    public function divide($item)
    {
        $this->value = $this->value / $item;   
        
        return $this;
    }
    
    public function getResult()
    {
        return $this->value;
    }
    
}


$number = new Calculate(100);
$number->remove(10);
$number->add(44);
$number->remove(68);
$number->multiply(2);
echo $number->getResult(); //132

Обратите внимание на частоту использования $number и это мы говорим просто 5 встроенных методах, а если и будут десятки?

Давайте доработаем наш код так, чтобы в нем появился текучий интерфейс. Для этого return необходимых нам методов с void заменится на $this, т.е. мы возвращаем весь контекст текущего экземпляра класса и можем обращаться к нему снова как к экземпляру класса.

<?php

class Calculate {
    
    
    private $value;
    
    public function __construct($value)
    {
        $this->value = $value;
    }
    
    public function add($item)
    {
        $this->value = $this->value + $item;
        
        return $this;
    }
    
    public function remove($item)
    {
        $this->value = $this->value - $item;
        
        return $this;
    }
    
    public function multiply($item)
    {
        $this->value = $this->value * $item;   
        
        return $this;
    }
    
    public function divide($item)
    {
        $this->value = $this->value / $item;   
        
        return $this;
    }
    
    public function getResult()
    {
        return $this->value;
    }
    
}


$number = (new Calculate(100))->remove(10)->add(44)->remove(68)->multiply(2)->getResult();

echo $number; //132

На самом деле никакой магии в этом действии нет и метод лишь призван сделать ваш код более читабельным.

 

Ihor Chyshkala

Пишу статьи про ИТ в свободное от работы время.

Оцените автора
Авторский блог Игоря Чишкалы
Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

  1. имя

    ок

    Ответить