Caching 将变量转移到较早的点,而不进行goto
如何在没有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
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();