Найти в Дзене

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

Свободный перевод статьи “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();
Определенно, будет проб

Свободный перевод статьи “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();


Таким образом, вы можете добавлять столько приватных свойств, сколько захотите. Но это будет работать только, если вы будете использовать одно и то же имя для метода и свойства.

Материал с сайта phpnick.ru. Ссылка на материал - https://phpnick.ru/posts/category/php/88