# Цепочки методов

Пусть у нас дан класс `Arr`, который хранит в себе массив чисел и может вычислять сумму этих чисел с помощью метода `getSum`. Числа могут добавляться по одному с помощью метода `add`, либо группой с помощью метода `push`:

`<?php class Arr { private $numbers = []; public function add($number) { $this->numbers[] = $number; } public function push($numbers) { $this->numbers = array_merge($this->numbers, $numbers); } public function getSum() { return array_sum($this->numbers); } } ?>`

Пример использования класса `Arr`:

`<?php $arr = new Arr; // создаем объект $arr->add(1); // добавляем в массив число 1 $arr->add(2); // добавляем в массив число 2 $arr->push([3, 4]); // добавляем группу чисел echo $arr->getSum(); // находим сумму элементов массива ?>`

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

`<?php echo $arr->add(1)->add(2)->push([3, 4])->getSum(); // это наша цель ?>`

Для того, чтобы можно было написать такую цепочку, нужно, чтобы все методы, которые участвуют в цепочке возвращали `$this` (кроме последнего). Поправим наш класс `Arr`:

`<?php class Arr { private $numbers = []; // массив чисел public function add($number) { $this->numbers[] = $number; return $this; // вернем ссылку сами на себя } public function push($numbers) { $this->numbers = array_merge($this->numbers, $numbers); return $this; // вернем ссылку сами на себя } public function getSum() { return array_sum($this->numbers); } } ?>`

Проверим, что все работает:

`<?php $arr = new Arr; echo $arr->add(1)->add(2)->push([3, 4])->getSum(); // выведет 10 ?>`

Можно упростить еще больше:

`<?php echo (new Arr)->add(1)->add(2)->push([3, 4])->getSum(); // выведет 10 ?>`

Не подсматривая в мой код самостоятельно реализуйте такой же класс `Arr`, методы которого будут вызываться в виде цепочки.

←→
↑