【问题标题】:Typehint a setter that allows null输入一个允许 null 的 setter
【发布时间】:2016-08-29 14:37:53
【问题描述】:

在我的实体中,我有一个作为值对象的属性。

class Meeting
{
    /** @var MeetingStatus */
    private $status

    /**
     * @param MeetingStatus|null $status
     */
    public function setStatus(MeetingStatus $status = null)
    {
        $this->status = $status ?: new MeetingStatus(MeetingStatus::DRAFT);
    }
}

我看到 typehint 和允许 null 的唯一方法是将 null 设置为默认参数值。但是允许没有必需参数的设置器似乎很奇怪。

$meeting->setStatus(); // wut?

有人对此有一个优雅的解决方案吗?

【问题讨论】:

  • 根据官方文档,给 $status 默认值 null 是要走的路。从语义上讲,调用 setStatus() 和 setStatus(null) 没有区别。

标签: php type-hinting


【解决方案1】:

public $status 设置为MeetingStatus::DRAFT

public function __construct() {
    $this->status = MeetingStatus::DRAFT;
}

如果设置为 NULL,请不要调用 setter。

始终设置会议状态。您可以将其设置为MeetingStatus::UNDEFINED 其中const UNDEFINED = null;

【讨论】:

    【解决方案2】:

    您可以在构造函数中设置默认值,就像在previous answer 中一样:

    private $status;
    
    public function __construct()
    {
        $this->status = new MeetingStatus(MeetingStatus::DRAFT);
    }
    
    public function setStatus(MeetingStatus $status)
    {
        $this->status = $status;
    }
    

    现在你不需要公开成员或在 setStatus() 中允许 null

    【讨论】:

    • 如果 OP 希望 $status 不可变,您的解决方案将有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2011-05-23
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多