关于PHP 7返回类型提示及为什么定义为返回类型的类不能返回null,已经有很多问题了。比如这个问题:Correct way to handle PHP 7 return types。 答案通常会说,如果函数应该返回一个类,则返回null可能是一个异常情况。 也许我错过了什么,但我真的不理解为什么。例如,我们来看一个简单的用户类:
class User
{
private $username; // mandatory
private $password; // mandatory
private $realName; // optional
private $address; // optional
public function getUsername() : string {
return $this->username;
}
public function setUsername(string $username) {
$this->username = $username;
}
public function getPassword() : string {
return $this->password;
}
public function setPassword(string $password) {
$this->password = $password;
}
public function getRealName() : string {
return $this->realName;
}
public function setRealName(string $realName = null) {
$this->realName = $realName;
}
public function getAddress() : Address {
return $this->address;
}
public function setAddress(Address $address = null) {
$this->address = $address;
}
}
在我们的应用程序中,拥有一个没有真实姓名和/或地址的用户是完全合法的。我甚至可以将真实姓名和地址字段设置为 null - 即使上面的解决方案不是最佳的。在我们的个人资料页面上,如果地址为空(null),我希望显示提示信息。
但这只是一个例子。我们的应用程序有100多个数据库表和相应的PHP类,几乎所有表都有可选字段。对于处理可选字段,总是编写 try catch 块而不是简单地检查 null,似乎对我来说有点次优。那么,对于上面的示例,有什么好的解决方案呢?
$this->realName
为空时,你期望调用代码调用getRealName()
的行为是什么?它是否需要测试该值并在其为空时处理它?如果是这样:你的类应该这样做。如果您利用空字符串在许多字符串操作中被视为空字符串的特性,那么您可能应该将其实际默认设置为空字符串,而不是null。大多数情况都可以这样解决。尽管如此,我认为PHP在强制执行此操作时持有不适当的态度。 - Adam CameronAddress::empty()
来表示空地址,而不是使用null。尽管我个人不会对可选字段进行类型提示。 - apokryfos