Объединение методов 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. имя

    ок

    Ответить