根据PHP 7返回类型提示,以及为什么如果将类定义为返回类型时不可能返回null,已经有很多问题了。像这样:Correct way to handle PHP 7 return types。 答案通常说,它不是一个问题,就好像一个函数应该返回一个类,然后返回null可能是一个例外。 也许我错过了某些东西,但我不明白为什么。例如,让我们看到一个简单的用户类:PHP 7返回类型提示
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;
}
}
在我们的应用程序是完全合法的,有一个用户没有实名和/或不带地址。我甚至可以将realName和address字段设置为null - 即使上述解决方案不是最优的。而在我们的个人资料页面中,如果地址为空(空),我想显示提示。
但这只是一个例子。我们的应用程序有超过100个数据库表和相应的PHP类,几乎所有的都有可选字段。总是写一个try catch块,而不是简单地检查null来处理可选字段,这对我来说似乎有点不理想。
那么对于上面的例子什么是一个好的解决方案?
你可以初始化变量以清空默认值(像字符串为''和地址对象为空/无效/默认值。你也可以使用你的类从包装器调用它们来捕获异常if您不会返回null – Nadir
我不认为getAddress()。getCity ===''比简单地检查getAddress()== null更好,除此之外,这个检查可能会很复杂,例如,如果邮政编码是可选的那么一个新的开发人员可以编写一个代码:getAddress()。getZip()==='',他/她认为地址丢失了,但是只有邮政编码丢失了 – Vmxes
在你的例子中,你期望调用代码的行为在'$ this-> realName'为空时调用'getRealName()'时是否需要测试值并在它为空时处理它?如果是这样的话:你的类应该这样做。对于大量的字符串操作来说,空字符串应该像空字符串一样对待,您可能实际上应该将其默认为空字符串,而不是空字符串。大多数情况可以像这样解决。这就是说,我认为PHP在执行这个过程中被认为是不恰当的。 –