我正在编写一个实用程序函数来处理数组。为了避免复杂性,假设它是一个简单的句柄,允许将速记数组插入到函数中:
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 世界中的大公司推荐的最佳实践。
其次,另一个问题(由第一个答案提示)是否存在针对此类问题的已建立的异常类/类名称?