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

Пусть у нас дан класс 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, методы которого будут вызываться в виде цепочки.