我正在编写一个实用程序函数来处理数组。为了避免复杂性,让我们说它是一个简单的句柄,允许将速记数组插入函数中:
function array_insert($original_arr,$key,$val){
$original_arr[$key]=$val;
return $original_arr;
}
用例是例如
validate_input(array_insert($_GET,'extra-key','val'));
现在让我们说我们可能会遇到$_GET
可能不是数组的问题。或者说我们从外部呼叫中获取输入;检查第一个参数是否为数组的责任在哪里?
如果这形成了复杂堆栈处理的开始,我们可以做到:
if (is_array($our_data)){
do_something($our_data);
do_something_else(array_insert($our_data,'key','val'));
}
这并不会让调用范围知道do_something
没有发生。所以我们可以这样做:
if (!is_array($our_data)){
throw new Exception('not an array');
}
现在使用我们的方法的任何东西都需要准备好捕获它,并且取决于我们是否真正关心结果,我们可能需要在我们的方法中捕获它。
我们可以简单地离开效用函数并返回false,其他东西可以检查:
function array_insert($original_arr,$key,$val){
if (!is_array($our_data)){
return []; // which is empty but expected, or return false.. or null...
}
}
然后是最低级别:
function array_insert(Array $original_arr)
如果数组未通过,将触发PHP级异常。
所以问题是;对于实用功能,我们对用例有多大的责任?我们是否使用TypeHint导致语言异常,我们是否会无声地失败,我们是否懒得检查并让最终用户弄明白?
首先,人们注意到这是主观的 - 我同意,尽管可能存在既定的最佳实践,例如:一个由PHP世界的认证计划或大公司推荐的。
其次,另一个问题(由第一个答案提示)是否存在针对此类问题的已建立的异常类/类名?
答案 0 :(得分:1)
正如评论中已经提到的,这是完全主观的,但个人而言:
我总是使用对象和数组的类型提示。
对于在原始类型上运行的函数,只有当某些值无效且可能不明显时,我才会根据该值抛出InvalidArgumentException
。
例如,计算数字的平方根的函数在传递负数时可能会抛出异常。
在所有其他情况下,我使用有意义的函数/参数名称,并假设有人决定将非数字字符串或数组传递给定义为的函数是个好主意
doStuffWithNumbers($num1, $num2)
,如果结果出现不好的事情,那就是他的责任。