保护我的方法免受错误的输入

时间:2013-12-15 11:30:03

标签: php oop validation exception null

我有这样的方法:

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而不是空字符串似乎没有任何改变,即使Bob叔叔不推荐这样做。)

问题是 - 有很多类似的方法。为每个参数保护每个这些参数可能成为null但是不应该这样做是否真的是最佳做法?

例如,另一种方法只能读取。然后似乎没有必要防范null因为null引用的任何内容都没有,对吧?或者我仍然要保护防守,为将来可能在某处确定null引用允许存储的情况做好准备并忘记调整警卫?

这听起来是最安全的方式,但会使所有涉及所有索引的保护代码大杂乱。这真的是最好的方式吗?

EDIT。 我放了更多的警卫,确实发现了一些我不会发现的错误。我的测试也没有发现它们。

此外,它有助于更​​好地理解读取方法的作用 - 如果找到则返回值如果没有则返回empty Array。输入$id = null位于 not found 下,因此也会返回empty Array。这样方法就是干净且一致的。

1 个答案:

答案 0 :(得分:2)

您可以使用PHP的is_null()empty()轻松管理此类输出。 另外,我建议你写一个仅在调试中使用的函数列表(因为你想要完善你的代码)。在要测试的每个方法中调用这些函数,并设置一个常量,如 DEBUG_MODE ,以处理调试函数的行为。所有这些都可以使用unit testing来完成,这需要更多的关注和时间。但如果你有两个或想要学习新东西,单元测试显然是一个更好的选择。

处理您能想到的所有案例也是一种好习惯。例如,如果你的“阅读方法”期望不找到空值(因为你认为没有因为你通过测试而没有通过测试),如果这个“阅读方法”碰巧找到一个空值,那就是“丑陋”的PHP错误将被显示在某处,或者更糟糕的是,如果error_report被关闭,您可能永远不会看到问题,或者更糟糕的是,代码可能会继续执行并彻底损坏更多数据。