Использование магического метода __call() в PHP

Добавлено: 30/11/2023 15:28 |  Обновлено: 30/11/2023 15:30 |  Добавил: nick |  Просмотры: 1468 Комментарии: 0
Вводная часть
Свободный перевод статьи “How to use PHP __call() Magic Method?” (laravel-school.com). Магический метод __call() в PHP – невероятно мощный инструмент для динамической обработки методов. Хотя его базовое использование хорошо известно, существует множество продвинутых методов и реальных сценариев, в которых метод __call() можно использовать для вывода вашего кода на новый уровень. В этой статье мы рассмотрим вариант использования метода __call() на простом практическом примере.
Представьте, что у вас есть такой класс:
class MyClass {
    private string $foo;
    private string $bar;

    public function __construct(string $foo, string $bar){
        $this->foo = $foo;
        $this->bar = $bar;
    }

    public function getFoo(){
        return $this->foo;
    }

    public function getBar(){
        return $this->bar;
    }
}	
Теперь вы можете получить доступ к нему следующим образом:
$object = new MyClass('Foo', 'Bar');

$object->foo();
$object->bar();
Определенно, будет проблемой, если ваших приватных свойств, к которым вы захотите получить доступ за пределами класса будет становиться больше. Поэтому для такого доступа можно использовать магический метод __call().
class MyClass {
    private string $foo;
    private string $bar;

    public function __construct(string $foo, string $bar){
        $this->foo = $foo;
        $this->bar = $bar;
    }

    public function __call($methodName, $arguments) {
        if (! property_exists($this, $methodName)) {
            throw new Exception("Bad Method Name Exception: $methodName");
        }

        return $this->$methodName;
    }
}	
Теперь вы можете получить доступ к приватным свойствам без использования геттеров.
$object = new MyClass('Foo', 'Bar');

$object->foo();
$object->bar();
Таким образом, вы можете добавлять столько приватных свойств, сколько захотите. Но это будет работать только, если вы будете использовать одно и то же имя для метода и свойства.

Оставьте свой комментарий

Комментариев нет