недавно я проверил пакет SwiftMailer и обнаружил эту проблему, которую не могу объяснить:
// #1
$message = new Swift_Message($subject)->setFrom($f)->setTo($t)->setBody($body);
// #2
$message = new Swift_Message($subject);
$message->setFrom($f)->setTo($t)->setBody($body);
// #3
$message = new Swift_Message($subject);
$message->setFrom($f);
$message->setTo($t);
$message->setBody($body);
Вариант № 1 взят из документации SwiftMailer и не работает, он выдает «неожиданную»>> ошибку анализа. Проблема была легко решена, варианты № 2 и № 3 работают отлично.
Я думал, что объединение методов является широко используемой техникой в PHP, и я также думал, что # 1 был совершенно допустимым. Почему это не работает, как ожидалось?
Мой PHP V7.1.1
Спасибо, Армин.
Пример номер один не написан как таковой в документах, ни одна из цепочек методов примеров создания класса, как это никогда не было действительным PHP.
Вместо этого документация написана так:
// Create the message
$message = (new Swift_Message())
// Give the message a subject
->setSubject('Your subject')
// Set the From address with an associative array
->setFrom(['[email protected]' => 'John Doe'])
// Set the To addresses with an associative array (setTo/setCc/setBcc)
->setTo(['[email protected]', '[email protected]' => 'A name'])
// Give it a body
->setBody('Here is the message itself')
// And optionally an alternative body
->addPart('<q>Here is the message itself</q>', 'text/html')
// Optionally add any attachments
->attach(Swift_Attachment::fromPath('my-document.pdf'));
Обратите внимание, что экземпляр класса создается в квадратных скобках. Это позволяет создавать цепочки методов непосредственно из конструктора.
Других решений пока нет …