Пусть у нас дан вот такой класс Employee
:
<?php
class Employee
{
private $name;
private $salary;
public function __construct($name, $salary)
{
$this->name = $name;
$this->salary = $salary;
}
public function getName()
{
return $this->name;
}
public function getSalary()
{
return $this->salary;
}
}
?>
Также пусть дан класс EmployeesCollection
для хранения коллекции работников:
<?php
class EmployeesCollection
{
private $employees = []; // массив работников
// Добавляет работника в набор
public function add($employee) // параметр - объект класса Employee
{
$this->employees[] = $employee; // добавим объект в набор
}
public function getTotalSalary()
{
$sum = 0;
foreach ($this->employees as $employee) {
$sum += $employee->getSalary();
}
return $sum;
}
}
?>
Рассмотрим внимательно метод add
класса
EmployeesCollection
: в нем параметром
передается объект класса Employee
.
Однако программисту, читающему наш код, сходу
тяжело будет понять, что параметром метода
add
должен служить именно объект и
именно класса Employee
.
Да, мы можем оставить комментарий в нашем коде, чтобы прояснить ситуацию, но это все равно не убережет программиста от ошибок, если он попытается передать, к примеру, объект какого-нибудь другого класса или вообще массив.
Было бы круто указать тип передаваемого параметра прямо в описании функции. Ранее в учебнике мы с вами уже разбирали подобную возможность для примитивов.
Можно также явно задать и тип параметра, в который будет передаваться объект - мы можем точно сказать, объект какого класса там ожидается.
Для этого перед именем переменной параметра
следует написать имя ожидаемого класса, в
нашем случае Employee
.
Давайте переделаем наш метод add
:
<?php
class EmployeeCollection
{
private $employees = [];
// Явно укажем тип параметра:
public function add(Employee $employee)
{
$this->employees[] = $employee;
}
public function getTotalSalary()
{
$sum = 0;
foreach ($this->employees as $employee) {
$sum += $employee->getSalary();
}
return $sum;
}
}
?>
Сделайте класс Post
(должность),
в котором будут следующие свойства, доступные
только для чтения: name
и salary
.
Создайте несколько объектов класса Post
:
программист, менеджер водитель.
Сделайте класс Employee
, в котором
будут следующие свойства: name
и surname
.
Пусть начальные значения этих свойств будут
передаваться параметром в конструктор.
Сделайте геттеры и сеттеры для свойств name
и surname
.
Пусть теперь третьим параметром конструктора
будет передаваться должность работника, представляющая
собой объект класса Post
. Укажите
тип этого параметра в явном виде.
Сделайте так, чтобы должность работника (то
есть переданный объект с должностью) записывалась
в свойство post
.
Создайте объект класса Employee
с
должностью программист. При его создании
используйте один из объектов класса Post
,
созданный нами ранее.
Выведите на экран имя, фамилию, должность и зарплату созданного работника.
Реализуйте в классе Employee
метод
changePost
, который будет изменять
должность работника на другую. Метод должен
принимать параметром объект класса Post
.
Укажите в методе тип принимаемого параметра
в явном виде.