我不确定我是否恰当地表达了这个问题,但我不知道如果不举例的话该如何提出这个问题,我会这样做的。
示例:
赛前比赛

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;

在某些情况下,将返回值同时用于错误指示和返回值是不可能的,因为false0或两者都是合法的返回值,并且您无法将其与错误代码区分开来。如果不打算使用异常,那么对“secondary”返回值使用by reference参数并不是一个糟糕的设计决策。

09-10 05:12
查看更多