1

我正在编写一个实用程序函数来处理数组。为了避免复杂性,假设它是一个简单的句柄,允许将速记数组插入到函数中:

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 世界中的大公司推荐的最佳实践。

其次,另一个问题(由第一个答案提示)是否存在针对此类问题的已建立的异常类/类名称?

4

1 回答 1

1

正如评论中已经提到的,这完全是主观的,但就个人而言:

  • 总是对对象和数组使用类型提示。

  • 对于在原始类型上运行的函数,我InvalidArgumentException仅在某些值无效且可能不明显时才基于该值抛出。例如,计算数字平方根的函数在传递负数时可能会引发异常。

  • 在所有其他情况下,我使用有意义的函数/参数名称,并假设如果有人认为将非数字字符串或数组传递给定义为的函数是一个好主意 doStuffWithNumbers($num1, $num2),那么如果结果中发生不好的事情是他的责任。

于 2014-10-08T11:54:55.760 回答