Свойства только для чтения в ООП на PHP
Сейчас мы с вами сделаем так, чтобы в объекте какое-то свойство было доступно только для чтения, но не для записи (англ. 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('john', 25); // создаем объект с начальными данными
// Имя можно только читать, но нельзя поменять:
echo $user->getName(); // выведет 'john'
// Возраст можно и читать, и менять:
echo $user->getAge(); // выведет 25
echo $user->setAge(30); // установим возраст в значение 30
echo $user->getAge(); // выведет 30
?>
Сделайте класс Employee
, в котором
будут следующие свойства: name
, surname
и salary
.
Сделайте так, чтобы свойства name
и surname
были доступны только для
чтения, а свойство salary
- и для
чтения, и для записи.