我不确定我是否恰当地表达了这个问题,但我不知道如果不举例的话该如何提出这个问题,我会这样做的。
示例:
赛前比赛
preg_match("/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/", $input_line, $output_array);
为什么要给preg_match参数
$output_array
?在php其余部分如何工作的上下文中,这似乎没有意义。下面的不是更传统吗?$output_array = preg_match("/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/", $input_line);
openssl_private_加密
openssl_private_encrypt ($data , $encrypted_data , $key);
再说一遍,为什么我们要将
$encrypted_data
传递给函数?而不是其他99%的函数所做的,并返回可用于设置变量值的结果。$encrypted_data = openssl_private_encrypt ($data, $key);
这是遗留问题吗?在某些功能上这样做有充分的理由吗?
最佳答案
由于php不擅长在旧的核心标准库中抛出异常,因此它需要不同的机制来区分函数操作的两个方面:
手术成功了吗?
如果有的话,返回值是多少?
在异常上构建更多的语言将具有如下特性:
try:
value = somefunc()
except SomeError:
# handle failure
像go这样的语言返回一个返回值和一个错误状态指示器:
value, err := somefunc()
if err != nil {
log.Fatal(err)
}
相反,php使用
return
值作为成功指示器,使用by-reference参数作为返回值,特别是当返回值并不总是感兴趣时:if (!somefunc($value)) {
// handle failure
}
echo $value;
否则代码必须如下所示:
$value = somefunc();
if ($value === false) {
// handle failure
} else if ($value === 0) {
// no match
}
echo $value;
在某些情况下,将返回值同时用于错误指示和返回值是不可能的,因为
false
或0
或两者都是合法的返回值,并且您无法将其与错误代码区分开来。如果不打算使用异常,那么对“secondary”返回值使用by reference参数并不是一个糟糕的设计决策。