-1

gotoなしでこれを書く方法:

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

要件:

1.順序を変更することはできません (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 コードの数行を置き換えたいが variable の値を変更できない場合にのみ役立ち、ランダムな HTML コードを生成する ALGORHYTM (var 値に依存) を変更します。

また、コードを確認したところ、GOTO ラベル ステートメントを使用しても、コードが $output1 の内容を変更しないことがわかりました。どうやってするか?唯一の方法は、最初から $output1 を再キャッシュすることです。それとも、他の方法でこれを行うことができますか?

4

3 に答える 3

1

メソッド/関数の概念に精通していますか?そうでない場合(そしてチャンスがあるようです..)、最初にそれらについて本当に何かを学ぶ必要があります。その場合、機能をモノリシックなコードブロックから小さくて保守可能なコードに分割するのは簡単です。

于 2009-12-26T21:40:56.293 に答える
1

構造化プログラミング-http://php.net/manual/en/language.oop5.php

于 2009-12-26T21:43:34.540 に答える
0

あなたがやりたいことをよく理解していれば、gotoの代わりに再帰関数を使用します。たとえば、私がしばらく前に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();

それは短い話の長い話です。

于 2009-12-26T21:49:08.757 に答える