在PHP中的类型提示和可选属性

14

我有一个处理日期的类方法:

public function setAvailability(DateTime $start, DateTime $end){
}

由于商品的可用性可以有下限、上限、两者都有或者没有,因此我希望setAvailability()方法也能接受NULL值。然而,NULL常量违反了类型提示:

$foo->setAvailability(NULL, $end);

触发器:

可捕获致命错误:传递给Foo::setAvailability()的第一个参数必须是DateTime实例,但实际传入的是null。

据我所知,我无法拥有一个没有值的DateTime实例。(我可以吗?)

出于某种原因,以下内容似乎有效:

public function setAvailability(DateTime $start=NULL, DateTime $end=NULL){
}
...
$foo->setAvailability(NULL, $end);

但看起来这只是靠纯粹的运气才能奏效的黑客行为。

在 PHP 类中如何处理未设置的日期?

2个回答

20

PHP关于类型提示的手册中已经很清楚地说明:

现在函数可以通过在函数原型中指定类名来强制参数为对象(自PHP 5.1起也可以为数组)。然而,如果使用NULL作为默认参数值,则允许在任何后续调用中将其用作参数。


1
+1 看起来是一个可靠的行为。但还是希望能够找到某种“空” DateTime 对象。 - Pekka
2
@zerocrates:谢谢。这不仅是一种有记录的行为,而且还在你期望它出现的章节中进行了解释。我感觉自己像个新手<:-) - Álvaro González

2

在我看来,你的示例似乎是在Item对象内部检查参数是否为空或DateTime对象(if/else)。我会将这个责任从Item对象中移除,并放到一个自定义的DateTime中,例如通过扩展DateTime。这个MyDateTime将负责知道日期是否“从时间开始”或不是。没有必要让Item执行此操作。


这个想法不错,但我现在更倾向于省略这种额外的复杂性层。 (实际代码并没有真正大量使用日期。) - Álvaro González

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接