Caching 将变量转移到较早的点,而不进行goto

Caching 将变量转移到较早的点,而不进行goto,caching,php-5.3,goto,ob-get-contents,Caching,Php 5.3,Goto,Ob Get Contents,如何在没有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

如何在没有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;
要求:

1。我不允许更改顺序(核心(echo$a)和插件($a=5)):

ob_start();
$a=0;
echo$a;
$output1=ob_get_contents();
ob_end_clean();
ob_start();
$a=兰特(0,10);
$output2=ob_get_contents();
ob_end_clean();
2.输出必须通过ob_get_contents()生成

但我可以在任何地方写任何代码

//解决方案 ob_get_contents()仅在希望替换输出HTML代码中的几行时有用,但无法更改变量的值来更改生成随机HTML代码的ALGORHYTM(取决于var值)

而且,
当我检查我的代码时,我明白,我的代码,即使使用GOTO labels语句,也不会更改$output1内容?。怎么做?唯一的办法就是从他的乞讨中重新提取$output1。或者我可以用其他方法来实现这一点?

您熟悉方法/函数的概念吗?如果不是的话(看起来机会是…),你应该先了解一下这些。然后,将功能从一个单一的代码块分割成小的、可维护的代码块是小菜一碟

结构化编程-

如果我很了解您想要做什么,我会使用递归函数而不是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;
}
您将有:

Apocalypse();

这就是长话短说。

这段代码让我非常非常难过。我也是。我有点困惑,你刚才似乎问了同样的问题。不太酷。实际上不一样,相似,不一样,另一个是与整个源公司的设计模式相关的。这是在一个主题变量传输中指定的,没有goto。
    #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();