【发布时间】:2013-12-15 11:30:02
【问题描述】:
我有这样的方法:
public function create (array $hash) {
$id = $hash[ID_KEY];
$this->store[$id] = $hash;
}
我想保护它免受错误输入引起的错误。
例如,我的代码可能会错误地将$hash 传递给
$id = '' or $id = null,
在这种情况下,它将被null 引用以静默方式存储。相反,我想看到一个警告并修改我的代码以摆脱它。所以我想最好的方法是抛出异常:
if (! $id) throw new Exception("Hash with empty id");
请注意,我使用空字符串作为几个方法参数和默认返回值的默认值,因此很容易出现这种错误。 (这里使用null而不是空字符串似乎并没有改变任何东西,即使鲍勃叔叔不建议这样做。)
问题是——有很多这样的方法。保护 每个 他们中的 each 参数真的是最佳做法,这些参数可以成为 null 但不应该?
例如,另一种方法只进行读取。那么似乎没有必要防范null,因为null 引用的任何内容都不会被存储,对吧?还是我应该继续防守,为将来可能会决定允许null引用的存储而忘记调整警卫的情况做准备?
这听起来是一种最安全的方法,但是会用大量的保护代码来混淆所有方法,其中包含所有涉及的索引。这真的是最好的方法吗?
编辑。 我设置了更多的警卫,确实发现了一些我不会发现的错误。我的测试也没有发现它们。
此外,它有助于更好地理解读取方法的作用——如果找到则返回值或如果没有则返回empty Array。输入 $id = null 位于 not found 之下,因此也返回 empty Array。这样该方法就干净且一致。
【问题讨论】:
-
这取决于你想多小心。我认为大多数程序员不会像这样设置很多守卫,他们首先会尝试正确调用他们的函数。
-
@Barmar 我已经尝试过了,但最终痛苦地浪费了太多时间寻找错误。 :(
-
那就继续吧,在每个函数的开头都加上守卫。
-
@Barmar 它不漂亮,但似乎不那么邪恶。我为此编写了一个通用的 util 函数,所以它只是在每个方法中多写了一行。
-
特别是因为它被标记为“oop”:正确使用对象可以大大减少此类问题。您将有一些方法必须接受标量类型并检查它们,但如果您要处理大部分正确类型检查的对象,则需要做的验证要少得多。
标签: php oop validation exception null