@WQP

Правильно ли использовать __call так?

Здравствуйте. На сколько правильно использовать __call в таком случае (класс ниже)? Будет несколько методов set и не хотелось бы каждый раз $this возвращать, когда это можно сделать всего 1 раз
Class A
class A
{
    protected $data;

    public function __call($name, $arguments)
    {
        if ( method_exists($this, $name) ) {
            call_user_func_array([$this, $name], $arguments);
        }

        return $this;
    }
    
    public function get()
    {
        return $this->data;
    }

    protected function setPreset()
    {
        // тут код манипуляции с $data, без return
    }
}

$A = new A();

$data = $A->setPreset()
          ->get();

  • Вопрос задан
  • 216 просмотров
Пригласить эксперта
Ответы на вопрос 3
@miksir
IT
__сall вызывается только если метода в классе нет, по-этому в вашем случае будете разное поведение при обращении к объекту извне и при обращении внутри класса, что не есть хорошо.
Ради экономии одной строчки с return такое не стоит делать.
Если уж делать, то полностью магию убрав setPreset вообще, или используйте IDE, который умеет генерить fluent setter
Ответ написан
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
На мой взгляд, соотношение принципа наименьшего удивления к полезности у такого подхода недопустимое и я бы так писать не стал.
Код становится менее понятным, нужно для каждого set-метода писать doc-блок с /** @return self */ (чтобы IDE не сходила с ума), что и вовсе убивает весь профит.
Ну и он накладывает определённый оверхед по производительности.
Ответ написан
nepster-web
@nepster-web
Старайтесь вообще не использовать магию и наследование, а так-же сеттеры.

1 - ide умеет само все генерировать. Если не умеет, смените Ваш текстовый редактор на ide.
2 - магия приводит к не очевидным вещам и сложности тестирования
3 - аккуратнее с сеттерами, используйте их реже, а все помещайте в конструктор.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
25 апр. 2024, в 14:21
15000 руб./за проект
25 апр. 2024, в 14:07
20000 руб./за проект
25 апр. 2024, в 14:06
2500 руб./за проект