我正在使用此代码并且它有效。事实是我不知道如何在没有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
}
答案 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/