2009-12-26 59 views
-1

如何寫這個沒有轉到:變量轉移到earier點而不轉到

ob_start(); 
$a = 0; 
echo "START of LEFT<br />"; 
begin: 
    if($a > 0) { 
     echo "CONTENT LEFT: $a<BR />"; 
     <VERY DIFFICULT ALGORHITM> 
     goto end; 
    } 
<... ALL THE REST CODE OF LEFT ...> 
echo "END of LEFT<br /><br />"; 
$output1 = ob_get_contents(); 
ob_end_clean(); 

ob_start();  
echo "START of CENTER<br />"; 
$a = 5; goto begin; 
end: 
    <... ALL THE REST CODE OF CENTER ...> 
    echo "END of CENTER<br />"; 
    $output2 = ob_get_contents(); 
    ob_end_clean(); 
    // print it 
    echo $output1.$output2; 

爲了得到這個回聲:

START of LEFT 
CONTENT LEFT: 5 
END of LEFT 

START of CENTER 
END of CENTER 

要求:

我不允許更改訂單(CORE(echo $ a)和PLUGIN($ a = 5)):

ob_start(); 
$a = 0; 
<ANY CODE> 
echo $a; 
$output1 = ob_get_contents(); 
ob_end_clean(); 

ob_start(); 
<ANY CODE> 
$a = rand(0,10); 
$output2 = ob_get_contents(); 
ob_end_clean(); 

2.輸出必須通過ob_get_contents)來生成(;

但我可以在任何地方寫任何代碼。

//解決 ob_get_contents();僅在需要替換輸出HTML代碼中的幾行時纔有幫助,但無法更改變量的值,以更改ALGORHYTM(取決於var值),從而生成隨機HTML代碼。

此外, 當我檢查了我的代碼,我明白了,我的代碼,甚至GOTO語句標籤DOES NOT將改變$輸出1內容?怎麼做?唯一的辦法是重新緩存從他的開始$ output1。或者,也許我能以其他方式做到這一點?

+2

這段代碼讓我非常傷心。 – 2009-12-26 21:39:32

+0

我也是。我有點困惑,剛纔你似乎也問過很多相同的問題。不那麼酷。 – moritz 2009-12-26 21:46:05

+0

非trully相同,相似,不一樣,另一個是全源公司。設計模式相關。這一個是在一個主題中指定的 - 無轉移的可變轉移。 – KestutisIT 2009-12-27 03:46:24

回答

1

您熟悉方法/函數的概念嗎?如果不是的話(看起來機會是......)你應該首先了解一些關於這些的東西。然後將功能從單塊代碼中分離出來,並將代碼分解爲小的,可維護的代碼塊。

0

如果我深知你想做的事,我會用遞歸函數,而不是轉到什麼。例如看這個數學表達式解析器我用C已經威滕前段時間:

#include <cstdio> 

const long MAX = 100010; 
char S[MAX], *p=S; 

long eval(); 
long termen(); 
long factor(); 


int main() { 
    FILE *fin=fopen("evaluare.in", "r"); 
    FILE *fout=fopen("evaluare.out", "w"); 

    fgets(S, MAX, fin); 
    fprintf(fout, "%ld\n", eval()); 
    return 0; 
} 

long eval() { 
    long r = termen(); 
    while (*p=='+' || *p=='-') { 
     switch (*p) { 
      case '+': 
       ++p;      // go over "+" 
       r += termen(); 
       break; 
      case '-': 
       ++p;      // go over "-" 
       r -= termen(); 
       break; 
     } 
    } 
    return r; 
} 

long termen() { 
    long r = factor(); 
    while (*p=='*' || *p=='/') { 
     switch (*p) { 
      case '*' : 
       ++p; 
       r *= factor(); 
       break; 
      case '/': 
       ++p; 
       r /= factor(); 
       break; 
     } 
    } 
    return r; 
} 

long factor() { 
    long r=0; 
    if (*p == '(') {      // subexpression 
     ++p;        // go over '(' 
     r = eval(); 
     ++p;        // go over ')' 
    } else { 
     while (*p>='0' && *p<='9') {  // number 
      r = r*10 + *p - '0'; 
      ++p; 
     } 
    } 
    return r; 
} 

的主要思想是在功能分割的代碼,並在那裏你讓我們說:

goto apocalypse 

你將有:

Apocalypse(); 

這是長話短說。