Начальные значения свойств при объявлении

Рассмотрим следующий класс:

<?php class Test { public $prop1; public $prop2; public function __construct() { $this->prop1 = 'value1'; // начальное значение свойства prop1 $this->prop2 = 'value2'; // начальное значение свойства prop2 } } $test = new Test; echo $test->prop1; // выведет 'value1' echo $test->prop2; // выведет 'value2' ?>

Как вы видите, в этом коде в конструкторе объекта мы задаем начальные значения свойств. На самом деле можно сократить лишний код, задав начальные значения свойств прямо при их объявлении:

<?php class Test { public $prop1 = 'value1'; // начальное значение свойства prop1 public $prop2 = 'value2'; // начальное значение свойства prop2 } $test = new Test; echo $test->prop1; // выведет 'value1' echo $test->prop2; // выведет 'value2' ?>

Замечания

Конечно же, не обязательно задавать начальные значения всем свойствам:

<?php class Test { public $prop1 = 'value1'; // задаем начальное значение public $prop2; // не задаем } ?>

При задании начальных значений свойств можно выполнять некоторые операции (самые примитивные):

<?php class Test { public $prop = 1 + 2; // найдем сумму чисел } $test = new Test; echo $test->prop; // выведет 3 ?>

Применение

Пусть у нас есть вот такой класс Student, в конструкторе которого задается начальное значение свойства course:

<?php class Student { private $name; private $course; public function __construct($name) { $this->name = $name; $this->course = 1; // начальное значение курса } public function transferToNextCourse() { $this->course++; } } ?>

Давайте вынесем начальное значение курса в объявление свойства:

<?php class Student { private $name; private $course = 1; // начальное значение курса public function __construct($name) { $this->name = $name; } public function transferToNextCourse() { $this->course++; } } ?>

Применение

Пусть у нас есть вот такой класс Arr, у которого есть метод add для добавления чисел и метод getSum для получения суммы всех добавленных чисел:

<?php class Arr { // Массив для хранения чисел: private $numbers; // Добавляет число в набор: public function add($num) { $this->numbers[] = $num; } // Находит сумму чисел набора: public function getSum() { return array_sum($this->numbers); } } ?>

Давайте воспользуемся нашим классом Arr - добавим несколько чисел и найдем их сумму:

<?php $arr = new Arr; $arr->add(1); $arr->add(2); $arr->add(3); echo $arr->getSum(); // выведет 6 ?>

Все вроде работает, но что будет, если сразу после создания вызвать метод getSum? Вот таким образом:

<?php $arr = new Arr; echo $arr->getSum(); ?>

Такой код вызовет ошибку, потому что функция array_sum пытается найти сумму массива из свойства numbers. Но это свойство еще не определено и имеет значение null. Это и приводит к ошибке. Давайте исправим проблему, объявив наше свойство пустым массивом:

<?php class Arr { private $numbers = []; // задаем начальное значение свойства как [] public function add($num) { $this->numbers[] = $num; } public function getSum() { return array_sum($this->numbers); } } ?>

Проверим:

<?php $arr = new Arr; echo $arr->getSum(); // выведет 0 ?>

Реализуйте класс Arr, похожий на тот, который я реализовал выше. В отличие от моего класса метод add вашего класса параметром должен принимать массив чисел. Все числа из этого массива должны добавляться в конец массива $this->numbers.

Реализуйте также метод getAvg, который будет находить среднее арифметическое чисел.