更有效的方式.php

时间:2011-06-22 14:59:39

标签: php performance structure

我正在使用此代码,但我知道这不是很有效。 还有另外一种方法吗?更高效 ?

  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);}
...

感谢

6 个答案:

答案 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');
    }
}

如果插件失败,您只需要让插件抛出异常。