没有goto使用PHP无法重写我的代码

时间:2013-08-07 07:43:30

标签: php loops goto

我正在使用此代码并且它有效。事实是我不知道如何在没有goto的情况下更有效地重写它。我个人认为在这种情况下使用goto(php中的新功能)是可以的,但其他人告诉我它不行。如何在不使用goto的情况下重写代码?为什么你认为我的代码很糟糕?我不是经验丰富的程序员,所以对我做错的任何建议表示赞赏。

    check_process:
    $random_code = substr(number_format(time() * rand(),0,'',''),0,10);

    $unique_check = $wpdb->get_var(
      "SELECT meta_id 
      FROM {$wpdb->postmeta} 
      WHERE meta_key = 'unique_code' 
      AND meta_value = '{$random_code}' 
      LIMIT 1"
    );

    if ($unique_check == NULL) {
       // OK
    }
    else {
        goto check_process; // go back and generate another unique code if are same
    }

6 个答案:

答案 0 :(得分:1)

do{
    $random_code = substr(number_format(time() * rand(),0,'',''),0,10);

    $unique_check = $wpdb->get_var(
      "SELECT meta_id 
      FROM {$wpdb->postmeta} 
      WHERE meta_key = 'unique_code' 
      AND meta_value = '{$random_code}' 
      LIMIT 1"
    );
} while ( ! is_null($unique_check));

答案 1 :(得分:0)

do {

...

} while {!is_null($unique_check))

我想你可以无休止地争论它,但我更喜欢这种风格而不是goto:)

答案 2 :(得分:0)

这看起来像是while

的工作
$check = true;
while($check){
    //do the stuff
    if($unique_check == NULL){
        $check = false;
    }
}

使用do-while

更简单
do {
    //do the stuff
} while($unique_check != NULL);

答案 3 :(得分:0)

使用do while循环怎么样?

do {
  $random_code = substr(number_format(time() * rand(),0,'',''),0,10);

  $unique_check = $wpdb->get_var(
    "SELECT meta_id 
    FROM {$wpdb->postmeta} 
    WHERE meta_key = 'unique_code' 
    AND meta_value = '{$random_code}' 
    LIMIT 1"
  );

} while (!is_null($unique_check)); // go back and generate another unique code if are same

使用这种循环而不是goto会更干净。

答案 4 :(得分:0)

对于最长时间goto不满意,当您在休息时使用goto时,结构会在代码中创建多个exit点,从理论上来说这些点非常糟糕。当天回到goto的替代gosub,不同之处在于gosub在完成它所做的事情时总是返回到调用点。所以今天gosub就像函数一样。

但是如果你反汇编一些代码并阅读汇编指令,你就会发现数百个jmp的引用就像goto一样。所以去看看。

答案 5 :(得分:0)

goto可能是一个简单的选择,但它的坏习惯就像你说的那样!

主要原因不是一个小小的转到它是质量。如果你对它过于熟悉,你会经常使用它。对于试图阅读和理解您的代码的其他开发人员来说,这是一个问题。事实上,有一个转到它很容易,但想象至少10.这将需要更多的时间来理解这个“意大利面条代码”。

更好的做法是使用函数“跳转”到代码中的特定算法,如果可能的话,使用其他答案中的循环。

在这里你可以看到如果你使用goto会发生什么:D http://xkcd.com/292/