Одним из интереснейших наблюдений, которое я вижу в нашей студии – 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
На самом деле никакой магии в этом действии нет и метод лишь призван сделать ваш код более читабельным.
ок