如何在没有转到的情况下写这个:
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 CODE中替换少行时帮助,但无法更改变量值,以更改ALGORHYTM(取决于var值) ),生成随机HTML代码。
另外, 当我检查我的代码时,我明白,我的代码,即使使用GOTO标签声明,也不会改变$ output1内容?怎么做?唯一的方法是从他的开始重新缓存$ output1。或者我可以通过其他方式做到这一点吗?
答案 0 :(得分:1)
您熟悉方法/功能的概念吗?如果没有(似乎机会是......)你应该先了解一下这些。然后,将单个代码块中的功能分解为小的,可维护的代码片段,这是一块蛋糕。
答案 1 :(得分:1)
答案 2 :(得分: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();
这就是长话短说。