【问题标题】:Transfer a variable to earier point without goto将变量转移到较早的点而不使用 goto
【发布时间】:2009-12-26 21:20:18
【问题描述】:

如何在没有 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 ), and 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。或者也许我可以通过其他方式做到这一点?

【问题讨论】:

  • 这段代码让我非常非常难过。
  • 我也是。我有点困惑,你刚才好像问了很多同样的问题。不太酷。
  • 不一样,相似,不一样,另一个是全源公司。设计模式相关。这一项在一个主题中指定 - 没有 goto 的变量传输。

标签: caching php-5.3 goto ob-get-contents


【解决方案1】:

您熟悉方法/函数的概念吗?如果不是(而且似乎很有可能......)你应该首先了解一些关于这些的知识。然后,将功能从一个单一的代码块拆分为小的、可维护的代码片段是小菜一碟。

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      如果我能很好地理解你想要做什么,我会使用递归函数而不是 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();
      

      这就是长话短说。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-19
        • 1970-01-01
        • 2012-05-04
        • 1970-01-01
        • 2011-11-12
        • 2015-07-05
        相关资源
        最近更新 更多