Работа с магическими методами
Я только учу ООП в PHP, не нужно меня строго судить за не правильные термины
Есть такое задание:
1). Добавьте в класс Point метод __toString() и реализуйте его, вернув строку такого вида: «Точка с координатами (x, y)». Вместо X и Y должны быть конкретные значения.
2). Создайте 3 разных объекта класса и выведите их через echo.
3). Реализуйте метод __get(), в котором при обращении к несуществующему свойству Z будет выведено сообщение «Класс работает только в двумерном пространстве»
4). Аналогично сделайте метод __set() при попытке изменить свойств Z.
5). Реализуйте метод call(), в котором выведите ту же строку, что и в пункте 3, при попытке вызвать метод setZ().
6). Создайте 1 объект класса Point и сделайте его клон. Убедитесь, что клонирование прошло успешно, попытавшись изменить свойство любого из объектов и выведя это свойство у обоих объектов. Они должны быть различны.
Вот мое решение:
<?php
class Point {
private $x;
private $y;
public function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
public function __toString() {
$coordinatePoints = '(' . $this->x . ', ' . $this->y . ')';
return $coordinatePoints;
}
public function __get($z) {
if (isset($this->z)) return $this->z;
return 'Класс <u>PointTaskSeven</u> работает только в двумерном пространстве';
}
public function __set($z, $value) {
if (isset($this->z)) return $this->z;
return 'Класс <u>PointTaskSeven</u> работает только в двумерном пространстве';
}
public function __call($method, $z) {
return 'Класс <u>PointTaskSeven</u> работает только в двумерном пространстве; <u>Переданные параметры: ' . $method . '(' . implode(', ', $z) . ')</u>';
}
public function __clone() {
$this->x = 95;
$this->y = 75;
}
}
$pointOne = new Point(12, 24);
echo "Объект#1 => Точки координат $pointOne;<br>";
$pointTwo = new Point(48, 64);
echo "Объект#2 => Точки координат $pointTwo;<br>";
$pointThree = new Point(128, 256);
echo "Объект#3 => Точки координат $pointThree;<br>";
echo 'Обращение к Z => ' . $pointThree->z . ';<br>';
echo 'echo: Изминение Z => ' . $pointThree->z = 15 . ';<br>';
echo 'echo: Обращение к setZ() =>' . $pointThree->setZ(12, 24, 48) . ';<br>';
$point = new Point(512, 1024);
echo "Объект#4 => Точки координат $pointTaskSeven;<br>";
$clonePoint = clone $point;
echo 'Клон->Объекта#4 => Точки координат ' . $clonePoint . ';<br>';
?>
Результат:
Объект#1 => Точки координат (12, 24);
Объект#2 => Точки координат (48, 64);
Объект#3 => Точки координат (128, 256);
Обращение к Z => Класс PointTaskSeven работает только в двумерном пространстве;
Изменение Z => 15;
Обращение к setZ() => Класс PointTaskSeven работает только в двумерном пространстве; Переданные параметры: setZ(12, 24, 48);
Объект#4 => Точки координат (512, 1024);
Клон->Объекта#4 => Точки координат (95, 75);
В моем решении не работают корректно пункт 4).
Пункт 4). дает такой ответ Изменение Z => 15;
Есть две точки X и Y с модификатором доступа private. Конструктор чтобы получить свойство Z обращается к __get() - «гетеру», где свойства Z не получает, выдается сообщение, что класс работает в двумерном пространстве.
После конструктор обращается к __set() - «сетеру», и устанавливает значение Z равное 15.
Мои мысли по работе кода и почему вывелось 15. В задании нужно вывести ошибку о работе в двумерном пространстве как понял, при отсутствии свойства Z. Как исправить не понимаю
Помогите разобраться с двумя пунктами 4).
Ответы (1 шт):
Выглядит как-то так:
class Point {
private $x;
private $y;
public function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
public function __toString() {
return 'Точка с координатами (' . $this->x . ', ' . $this->y . ')';
}
public function __get($var) {
if ('x' === $var || 'y' === $var) {
return $this->$var;
}
return 'Класс <u>PointTaskSeven</u> работает только в двумерном пространстве';
}
public function __set($var, $value) {
if ('x' === $var || 'y' === $var) {
$this->$var = $value;
return;
}
echo 'Класс <u>PointTaskSeven</u> работает только в двумерном пространстве';
}
public function __call($method, $argument) {
if ('setZ' === $method) {
echo 'Класс <u>PointTaskSeven</u> работает только в двумерном пространстве';
}
}
}
$pointOne = new Point(12, 24);
echo "Объект#1 => $pointOne;<br>";
$pointTwo = new Point(48, 64);
echo "Объект#2 => $pointTwo;<br>";
$pointThree = new Point(128, 256);
echo "Объект#3 => $pointThree;<br>";
echo 'Обращение к Z:<br>';
echo $pointThree->z;
echo "<br>";
echo 'Изменение Z:<br>';
$pointThree->z = 15;
echo "<br>";
echo 'Обращение к setZ()<br>';
$pointThree->setZ(12);
echo "<br>";
$point = new Point(512, 1024);
$clonePoint = clone $point;
$clonePoint->x = 102;
echo "Объект#4 => $point;<br>";
echo "Клон->Объекта#4 => $clonePoint;<br>";