Свойства только для чтения

Сейчас мы с вами сделаем так, чтобы в объекте какое-то свойство было доступно только для чтения, но не для записи (англ read-only).

Это делается следующим образом: для такого свойства нужно сделать геттер, но не делать сеттер.

В этом случае свойство можно будет прочитать с помощью геттера, но нельзя будет записать, так как сеттер отсутствует.

При этом изначальное значение свойства будет задаваться в конструкторе при создании объекта.

Давайте попробуем реализовать описанное.

Пусть у нас дан вот такой класс User:

<?php class User { private $name; private $age; } ?>

Давайте сделаем так, чтобы свойство name было доступно только для чтения, а свойство age - и для чтения и для записи. Для этого свойству name сделаем только геттер, а свойству age - и геттер и сеттер:

<?php class User { private $name; private $age; // Геттер для имени: public function getName() { return $this->name; } // Геттер для возраста: public function getAge() { return $this->age; } // Сеттер для возраста: public function setAge($age) { $this->age = $age; } } ?>

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

<?php class User { private $name; private $age; //!! Конструктор объекта: public function __construct($name, $age) { $this->name = $name; $this->age = $age; } // Геттер для имени: public function getName() { return $this->name; } // Геттер для возраста: public function getAge() { return $this->age; } // Сеттер для возраста: public function setAge($age) { $this->age = $age; } } ?>

Все - наша задача решена, убедимся в этом:

<?php $user = new User('Коля', 25); // создаем объект с начальными данными // Имя можно только читать, но нельзя поменять: echo $user->getName(); // выведет 'Коля' // Возраст можно и читать, и менять: echo $user->getAge(); // выведет 25 echo $user->setAge(30); // установим возраст в значение 30 echo $user->getAge(); // выведет 30 ?>

Сделайте класс Employee, в котором будут следующие свойства: name (имя), surname (фамилия) и salary (зарплата).

Сделайте так, чтобы свойства name и surname были доступны только для чтения, а свойство salary - и для чтения, и для записи.