SlavaAurim
@SlavaAurim
Веб-программист и интернет-маркетолог

Почему современные PHP библиотеки и фреймворки избегают передачу нескольких параметров в метод через ассоциативный массив?

Почему так:

<?php 
$mail = new Mail();
$mail->setTo('mailto@mail.ru');
$mail->setFrom('mailfrom@mail.ru');
$mail->setSubject('Тема письма')
$mail->setBody('Текст письма');
$mail->send();


Почему не так?

$mail = new Mail([
    'to' => 'mailto@mail.ru',
    'from' => 'mailfrom@mail.ru',
    'subject' => 'Тема письма',
    'body' => 'Текст письма'
]);

$mail->send();


Второй пример мне кажется и лаконичнее и красивее и читабельнее. Но чем он может быть хуже в плане поддержки и расширяемости кода? Почему первый способ установки параметров объекта встречается чаще?
  • Вопрос задан
  • 553 просмотра
Решения вопроса 1
Пригласить эксперта
Ответы на вопрос 3
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
Прозрачность.
Потому, что так сложнее контролировать то, что приходит (тайпхинтинг), документировать (phpDoc), кроме того нужно ещё дополнительно проверять массив на наличие нужных ключей.
Это не говоря уже о том, что это портит end-user experience, когда вы работаете, скажем, в какой-нибудь IDE, где вам будет очень понятно и удобно показываться, какой аргумент для чего нужен и какого он типа.
Плюс, вы немного странное сравнение делаете. Если уж сравнивать инициализацию через конструктор, то с инициализацией через конструктор с отдельными аргументами.
Ответ написан
@Nc_Soft
Автокомплита нет с массивом
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Можно писать включая пакетную передачу как отдельно, так и в get/set ("перегружено"): чтобы и массив можно было передать в конструктор или функцию send(), и set/get'ры работали. Это наиболее оптимально.
$data=array([
    'to' => 'mailto@mail.ru',
    'from' => 'mailfrom@mail.ru',
    'subject' => 'Тема письма',
    'body' => 'Текст письма'
]);

Тогда:
$mail = new Mail($data);
$mail->send();
или
$mail = new Mail();
$mail->send($data);

и потом:
$mail->to("новый@адрес.отправителя"); //setter
или текущий:
$current = $mail->to(); //getter
Когда используем массив, то методы setter/getter можно сформировать динамически, а можно проверить "ключи" на присутствие одноимённых методов в классе и лишнее - исключить/обработать с ошибкой.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы