Работа с магическими методами

Я только учу ООП в 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 шт):

Автор решения: u_mulder

Выглядит как-то так:

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>";
→ Ссылка