PhP构造函数和链接

时间:2017-09-22 09:47:13

标签: php method-chaining

最近我检查了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

Thx,Armin。

1 个答案:

答案 0 :(得分:1)

示例第一个不是在docs中编写的,类实例化的示例方法链都没有,因为它从来就不是有效的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(['john@doe.com' => 'John Doe'])

    // Set the To addresses with an associative array (setTo/setCc/setBcc)
    ->setTo(['receiver@domain.org', 'other@domain.org' => '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'));

请注意,该类在封闭括号内实例化。这允许直接从构造函数链接方法。