我正在使用此代码,但我知道这不是很有效。 还有另外一种方法吗?更高效 ?
if ($val-> check($form) === true) {
{$data['livre'] = $val-> validate_age($form);}
if ($val->validate_age($form) === true) {
{$data['livre'] = $val->insertData($db, $form, $id);}
if ($val->insertData($db, $form, $id) === true) {
{$data['livre'] = $val->insertLanguages($db, $form, $id);}
if ($val->insertLanguages($db, $form, $id) === true) {
{$data['livre'] = $val->val($form);}
if ($val->val($form) === true) {
{$data['livre'] = $val->valexp($form);}
if ($val->valexp($form) === true ) {
{$data['livre'] = $val->insertWorker($db, $form, $id);}
if ($val->insertWorker($db, $form, $id) === true) {
{$data['livre'] = $val->univAndCourse($form);}
...
感谢
答案 0 :(得分:1)
你可以提前退出..我不知道你的代码在发生故障时到底发生了什么,但如果这是在一个函数中......你可以做而不是这样:
if(condition1) {
if (condition2) {
return true;
}
}
return false;
你可以这样做:
if (!condition1) {
return false;
}
if (!condition2) {
return false;
}
return true;
所以你基本上先处理'else'案例..
除此之外......这也可能有效:
if (condition1 && condition2 && condition3 && condition4) {
return true;
}
或:
if (
condition1 &&
condition2 &&
condition3 &&
condition4
) {
return true;
} else {
return false;
}
答案 1 :(得分:1)
在这个非常具体的案例中,您可以使用and
链接将其压缩为表达式:
$val-> check($form)
AND
$data['livre'] = $val-> validate_age($form)
AND
$data['livre'] = $val->insertData($db, $form, $id)
AND
$data['livre'] = $val->insertLanguages($db, $form, $id)
AND
$data['livre'] = $val->val($form)
AND
$data['livre'] = $val->valexp($form)
AND
$data['livre'] = $val->insertWorker($db, $form, $id);
这似乎非常合适,因为你真的加倍分配,if
否则检查。
这是有效的,因为and
的优先级低于=
分配运算符。您的===true
支票是多余的。如果你想要,你可以将整个条件链重新打包为if ()
谓词。
答案 2 :(得分:1)
这就是exceptions的用途:
try {
$data['livre'] = $val->validate_age($form);
$data['livre'] = $val->insertData($db, $form, $id);
$data['livre'] = $val->insertLanguages($db, $form, $id);
$data['livre'] = $val->val($form);
$data['livre'] = $val->valexp($form);
$data['livre'] = $val->insertWorker($db, $form, $id);
$data['livre'] = $val->univAndCourse($form);
} catch (Exception $e) {
//
// Do what ever necessary to process the interrupted logic.
//
}
当然,这意味着验证器类的方法抛出exceptions
而不是返回booleans
:
class Validator {
function validate_age($form) {
if (!is_numeric($form['age'])) throw new Exception('Invalid age.');
}
//
// .. etc ..
//
}
答案 3 :(得分:1)
看起来你的所有函数调用都返回一个bool。这段代码应该有效。如果任何调用返回false,则$ data ['livre']将为false。
$data['livre'] = $val->check($form) &&
$val->validate_age($form) &&
$val->insertData($db, $form, $id) &&
$val->insertLanguages($db, $form, $id) &&
$val->val($form) &&
$val->valexp($form) &&
$val->insertWorker($db, $form, $id) &&
$val->univAndCourse($form);
答案 4 :(得分:0)
将其包裹在一个函数中,如果结果为负,则将所有检查都转为负数并从函数返回。 此外,您可以在$ val方法中使用异常,这样您就可以在出现错误时中断执行,而无需检查每个操作。
答案 5 :(得分:0)
您可以在一个外部条件中检查所有验证,在其中打开一个数据库事务。将所有插入放在catch中的try和事务回滚中。
类似的东西:
if ($val-> check($form) === true && $val->validate_age($form) === true && $val->val($form) === true && $val->valexp($form) === true) {
//begin your transaction here. Depending on your framework it could be different.
mysql_query('start transaction');
try {
$val->insertData($db, $form, $id);
$val->insertLanguages($db, $form, $id);
$val->insertWorker($db, $form, $id);
//... blah blah blah more inserts here
//commit your transaction here
mysql_query('commit');
} catch (Exception $e) {
//Roll back the transaction here
mysql_query('rollback');
}
}
如果插件失败,您只需要让插件抛出异常。