Методы PHP, начинающиеся с двойного подчеркивания
__
, называются магическим.
Магия таких методов состоит в том, что они
могут вызываться при совершении какого-то
действия автоматически.
Первый магический метод, который мы с вами
изучим, называется __toString
. Он
вызывается при попытке приведения экземпляра
класса к строке. Давайте разберемся, что
это значит. Пусть у нас дан вот такой класс
User
:
<?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;
}
}
?>
Давайте создадим объект этого класса:
<?php
$user = new User('john', 25);
?>
А теперь попытаемся вывести созданный объект
через echo
:
<?php
$user = new User('john', 25);
echo $user;
?>
Попытка сделать вывод объекта через echo
и есть преобразование к строке. В данном
случае PHP выдаст ошибку, так как просто
так объекты в строку не преобразуются.
Для того, чтобы убрать ошибку, мы должны
в явном виде сказать PHP, что делать при
попытке преобразовать объект в строку. Для
этого и существует магический метод __toString
.
Если в коде нашего класса сделать такой метод,
то результат этого метода (то есть то, что
он вернет через return
) и будет строковым
представлением объекта.
Пусть мы хотим, чтобы при попытке вывести
объект через echo
, выводилось имя
юзера. Значит сделаем метод __toString
и вернем в нем значение свойства name
:
<?php
class User
{
private $name;
private $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
// Реализуем указанный метод:
public function __toString()
{
return $this->name;
}
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Проверим:
<?php
$user = new User('john', 25);
echo $user; // выведет 'john' - все работает!
?>
Сделайте класс User
, в котором будут
следующие свойства - name
, surname
,
patronymic
. Сделайте так, чтобы при
выводе объекта через echo
на экран
выводилось ФИО пользователя.
Применение
Пусть у нас есть вот такой класс, с помощью которого можно добавлять элементы в массив и находить их сумму:
<?php
class Arr
{
private $numbers = [];
public function add($num)
{
$this->numbers[] = $num;
return $this;
}
public function getSum()
{
return array_sum($this->numbers);
}
}
?>
Давайте вспомним, как мы пользовались этим классом:
<?php
$arr = new Arr;
echo $arr->add(1)->add(2)->add(3)->getSum(); // выведет 6
?>
Как вы видите, у нас будет цепочка методов
add
, а последним методом мы всегда
должны вызвать getSum
, чтобы получить
сумму.
Давайте сделаем так, чтобы этот метод не
нужно было писать, если мы выводим результат
через echo
. Для этого нам и пригодится
изученный метод __toString
.
Есть, однако, один нюанс, мы сейчас рассмотрим.
Пусть наша реализация метода __toString
будет такой:
<?php
public function __toString()
{
return array_sum($this->numbers);
}
?>
Данный код выдаст ошибку, так как __toString
обязательно должен вернуть строку, а результатом
array_sum
будет число.
Исправим проблему, принудительно преобразовав результат в строку:
<?php
public function __toString()
{
return (string) array_sum($this->numbers);
}
?>
Применим изменения:
<?php
class Arr
{
private $numbers = [];
public function add($num)
{
$this->numbers[] = $num;
return $this;
}
public function __toString()
{
return (string) array_sum($this->numbers);
}
}
?>
Проверим:
<?php
$arr = new Arr;
echo $arr->add(1)->add(2)->add(3); // выведет '6'
?>
Не подсматривая в мой код, реализуйте такой
же класс Arr
.