Php 方法可以返回错误或数组错误实现?

Php 方法可以返回错误或数组错误实现?,php,design-patterns,Php,Design Patterns,我正在阅读,其中有一条语句警告不要使用具有双重用途的变量,例如: 1) If a variable is a number, it contains error code. 2) If a varibale is array, it contains data. 这正是我在程序中使用下面代码段中的变量$text所做的: $text = $editor->getTextForLinking($data_array['idText']); if (Arr::is_array($text))

我正在阅读,其中有一条语句警告不要使用具有双重用途的变量,例如:

1) If a variable is a number, it contains error code.
2) If a varibale is array, it contains data.
这正是我在程序中使用下面代码段中的变量
$text
所做的:

$text = $editor->getTextForLinking($data_array['idText']);
if (Arr::is_array($text)) {
    ...
} else {
    Log::instance()->add(Log::Error, $text);
    $this->response->body("Text can't be retrieved");
}
我有权访问getTextForLinking()方法,因此可以对其进行更改。如何改变它以排除双重目的的不良情况

我不想使用这样的异常:

$text = Array();
try {
    $text = $editor->getTextForLinking($data_array['idText']);
} catch(SomeException $e) {
    Log::instance()->add(Log::Error, $text);
    $this->response->body("Text can't be retrieved");
}

不要检查返回值,而是检查函数的参数。换句话说,修改
getTextForLinking
函数,在处理结果之前进行类型检查

伪代码示例:

function getTextForLinking($text) {

 if $text is array, 
   process it and return an array containing data

else 
  return an array without data , or empty array.

}

我认为很明显,如果
getTextForLinking()
返回的任何内容(不是数组)都应该被视为错误(已记录),那么我并不完全相信您的示例可以做出这样的更改

因此,无论发送什么数据,保持函数返回签名的数据类型相同可能是一种改进。通过这种方式,它将保持一致性(您不再需要
$text=Array();
),并且您不必根据错误与否来制定特殊情况

$results = $editor->getTextForLinking($data_array['idText']);
if (empty($results)) { 
  Log::instance()->add(Log::Error, $data_array['idText']);
} else {
  // Handle results array 
}
更新

如果在函数中设置错误消息,则会违反-A函数/方法应该只有一个作业。就
$editor->getTextForLinking()
而言,它总是返回一个文本数组,而不处理返回的错误

错误消息应取决于上下文(使用该方法时)。如果在某个点上空数组无效,则在函数外部处理/设置错误(消息),如上所示


这样做可以让
$editor
忽略返回结果的有效性,并且可以让您在空数组不被视为错误的地方重用函数。

听起来可能很傻,但为什么不是空数组呢?因为我不知道数据库中是否没有这样的文本,或者在方法执行过程中是否发生了错误。这有意义吗?是的,但这应该转移到方法本身。提供相同的返回类型有助于保持一致性,因此您总是知道您会得到一个数组(空或不空)-如果没有文本,或者出现错误,函数有责任在内部处理适当的情况。谢谢,我已经想到了这一点,也许这就是要走的路。如果总是返回一个整数作为结果(0=success,!=0 failure)并通过引用传递某个数组变量以将文本放入方法中,会怎么样?从这个问题看,参数似乎总是相同的(可能是一个数字),则是返回类型发生了变化。在你的例子中,问题是双重的:你需要检查参数和结果…@DamienPirsy,我认为我们不需要检查结果,因为它被理解为返回一个数组,但没有数据。。。如果我们需要检查它,if-else语句就足够了。我这么说是因为在编辑之前,您编写了“返回数组或空值”,这意味着不同的返回类型。尽管如此,参数检查还是多余的——看起来它与实现总是一样的。如果需要,我如何知道
getTextForLinking()
方法中发生了什么错误?总是返回一个整数作为结果(0=success,!=0 failure),并通过引用传递一些数组变量,以便将文本放入一个好的选项中?谢谢,如果您在函数中设置了一条错误消息,因为我在getTextForLinking()之外记录了一个错误,请澄清您在这里所指的函数是什么方法?
如果在执行getTextForLinking()方法(与DB的连接丢失)期间发生异常,它是否仍应返回空数组?