Передача переменной в более раннюю точку без перехода
Как написать это без 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-КОДЕ, но не можете изменить значение переменной, чтобы изменить ALGORHYTM(зависит от значения var), который генерирует случайный HTML-код.
Также, когда я проверил свой код, я понимаю, что мой код, даже с оператором GOTO label, НЕ собирается изменять содержимое $output1? Как это сделать? Единственный способ - это восстановить $output1 с самого начала. Или, может быть, я могу сделать это другими способами?
3 ответа
Вы знакомы с концепцией методов / функций? Если нет (и, похоже, шансы есть...), вам стоит сначала кое-что узнать о них. После этого можно легко отделить функциональность от монолитного блока кода до небольших поддерживаемых фрагментов кода.
Структурированное программирование - http://php.net/manual/en/language.oop5.php
Если бы я хорошо понял, что вы хотите сделать, я бы использовал рекурсивные функции вместо 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();
Это длинная история, коротко сказано.