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的连接丢失)期间发生异常,它是否仍应返回空数组?