<object id="xwuag"></object>
      1. <tbody id="xwuag"><pre id="xwuag"><video id="xwuag"></video></pre></tbody>
        <progress id="xwuag"></progress>

        <nav id="xwuag"><big id="xwuag"><rt id="xwuag"></rt></big></nav>
        <em id="xwuag"></em>

        <nav id="xwuag"></nav><rp id="xwuag"></rp>
        <li id="xwuag"></li>
      2. <rp id="xwuag"></rp>
        <s id="xwuag"></s><th id="xwuag"><pre id="xwuag"><video id="xwuag"></video></pre></th>
      3. <nav id="xwuag"><center id="xwuag"></center></nav>
          <dd id="xwuag"><big id="xwuag"></big></dd>

          goto

          (PHP 5 >= 5.3.0, PHP 7)

          goto 操作符可以用来跳转到程序中的另一位置。该目标位置可以用目标名称加上冒号来标记,而跳转指令是 goto 之后接上目标位置的标记。PHP 中的 goto 有一定限制,目标位置只能位于同一个文件和作用域,也就是说无法跳出一个函数或类方法,也无法跳入到另一个函数。也无法跳入到任何循环或者 switch 结构中。可以跳出循环或者 switch,通常的用法是用 goto 代替多层的 break

          Example #1 goto 示例

          <?php
          goto a;
          echo 
          'Foo';
           
          a:
          echo 
          'Bar';
          ?>

          以上例程会输出:

          Bar
          

          Example #2 goto 跳出循环示例

          <?php
          for($i=0,$j=50$i<100$i++) {
            while(
          $j--) {
              if(
          $j==17) goto end
            }  
          }
          echo 
          "i = $i";
          end:
          echo 
          'j hit 17';
          ?>

          以上例程会输出:

          j hit 17
          

          Example #3 以下写法无效

          <?php
          goto loop;
          for(
          $i=0,$j=50$i<100$i++) {
            while(
          $j--) {
              
          loop:
            }
          }
          echo 
          "$i = $i";
          ?>

          以上例程会输出:

          Fatal error: 'goto' into loop or switch statement is disallowed in
          script on line 2
          

          Note:

          goto 操作符仅在 PHP 5.3及以上版本有效。

          xkcd-goto.png
          此漫画鸣谢 » xkcd
          add a note add a note

          User Contributed Notes 14 notes

          up
          79
          chrisstocktonaz at gmail dot com
          9 years ago
          Remember if you are not a fan of wild labels hanging around you are free to use braces in this construct creating a slightly cleaner look. Labels also are always executed and do not need to be called to have their associated code block ran. A purposeless example is below.

          <?php

          $headers
          = Array('subject', 'bcc', 'to', 'cc', 'date', 'sender');
          $position = 0;

          hIterator: {

             
          $c = 0;
              echo
          $headers[$position] . PHP_EOL;

             
          cIterator: {
                  echo
          ' ' . $headers[$position][$c] . PHP_EOL;

                  if(!isset(
          $headers[$position][++$c])) {
                      goto
          cIteratorExit;
                  }
                  goto
          cIterator;
              }

             
          cIteratorExit: {
                  if(isset(
          $headers[++$position])) {
                      goto
          hIterator;
                  }
              }
          }
          ?>
          up
          50
          Ray dot Paseur at Gmail dot com
          7 years ago
          You cannot implement a Fortran-style "computed GOTO" in PHP because the label cannot be a variable. See: http://en.wikipedia.org/wiki/Considered_harmful

          <?php // RAY_goto.php
          error_reporting(E_ALL);

          // DEMONSTRATE THAT THE GOTO LABEL IS CASE-SENSITIVE

          goto a;
          echo
          'Foo';
          a: echo 'Bar';

          goto
          A;
          echo
          'Foo';
          A: echo 'Baz';

          // CAN THE GOTO LABEL BE A VARIABLE?

          $a = 'abc';
          goto
          $a; // NOPE: PARSE ERROR
          echo 'Foo';
          abc: echo 'Boom';
          ?>
          up
          23
          D. Kellner
          3 years ago
          However hated, goto is useful. When we say "useful" we don't mean "it should be used all the time" but that there are certain situations when it comes in handy.

          There are times when you need a logical structure like this:
          <?php
          // ...
          do {

             
          $answer = checkFirstSource();
              if(
          seemsGood($answer)) break;

             
          $answer = readFromAnotherSource();
              if(
          seemsGood($answer)) break;

             
          // ...

          }while(0);
          $answer = applyFinalTouches($answer);
          return
          $answer;
          ?>

          In this case, you certainly implemented a goto with a "fake loop pattern".  It could be a lot more readable with a goto; unless, of course, you hate it.  But the logic is clear: try everything you can to get $answer, and whenever it seems good (e.g. not empty), jump happily to the point where you format it and give it back to the caller.  It's a proper implementation of a simple fallback mechanism.

          Basically, the fight against goto is just a side effect of a misleading article many decades ago.  Those monsters are gone now.  Feel free to use it when you know what you're doing.
          up
          5
          R. Borchmann
          2 years ago
          If you feel the urge to leave a nested loop with goto, better think again. Probably you've got a piece of your code that should be refactored into a function.

          Instead of

          <?php
            
          for ($i=0; $i<10; $i++) {
                for (
          $j=$i, $j<11; $j++) {
                   if (
          $data[$i] === $data[$j] )
                       goto
          foundit;
                }
             }
             echo
          "Sorry, no match";
             goto
          nextAction;
          foundit:
             echo
          "Duplicate at $i and $j)";
          nextAction:
          ?>

          you better write

          <?php
          list($success, $i, $j) = searchForDuplicate( $data );

          if (
          $success)
             echo
          "Found it at ($i, $j)";
          else
             echo
          "Sorry, no match";

          function
          searchForDuplicate( &$data )
          {
             for (
          $i=0; $i<10; $i++) {
                for (
          $j=$i, $j<11; $j++) {
                   if (
          $data[$i] === $data[$j] )
                       return [
          true, $i, $j ];
                }
             }
             return [
          false];
          }
          ?>

          or return [$i, $j] and [-1, -1] if you don't like an extra $success variable. Refactoring into a function is cleaner and gives you an auto-documentation about what the loop is doing.
          up
          15
          sixoclockish at gmail dot com
          6 years ago
          You are also allowed to jump backwards with a goto statement. To run a block of goto as one block is as follows:
          example has a prefix of iw_ to keep label groups structured and an extra underscore to do a backwards goto.

          Note the `iw_end_gt` to get out of the labels area

          <?php
              $link
          = true;

              if (
          $link ) goto iw_link_begin;
              if(
          false) iw__link_begin:
             
              if (
          $link ) goto iw_link_text;
              if(
          false) iw__link_text:
             
              if (
          $link ) goto iw_link_end;
              if(
          false) iw__link_end:
             
              goto
          iw_end_gt;
             
             
              if (
          false) iw_link_begin:
                  echo
          '<a href="#">';
              goto
          iw__link_begin;
             
              if (
          false) iw_link_text:
                  echo
          'Sample Text';
              goto
          iw__link_text;
             
              if (
          false) iw_link_end:
                  echo
          '</a>';
              goto
          iw__link_end;
             
             
          iw_end_gt:
          ?>
          up
          14
          f at francislacroix dot info
          7 years ago
          The goto operator CAN be evaluated with eval, provided the label is in the eval'd code:

          <?php
          a
          : eval("goto a;"); // undefined label 'a'
          eval("a: goto a;"); // works
          ?>

          It's because PHP does not consider the eval'd code, containing the label, to be in the same "file" as the goto statement.
          up
          3
          at YearOfCodes (retrobytespr at mail dot com)
          1 year ago
          Here is an example of re-using labels in separate methods - in this example, the end: label is used in each, with the goto condition behaving like an if/else condition:

          class DateController
          {
              public $day, $month, $year;
              public function __construct(){
                  $this->day   = $this->setDays();
                  $this->month = $this->setMonths();
                  $this->year  = $this->setYears(1901, (int)date('Y'), 'asc');
              }
             
              /**
               * @param    int
               * @return   array
               */
              protected function setDays(int $default = 0){
                  $days    = array();
                  for($i = 1; $i <= 31; $i++){
                      $day    = "{$i}";
                      if($i<10){
                          $day    = "0{$i}";
                      }
                      $days[$day]    = $day;
                  }
                  if($default == 0){
                      goto end;
                  }
                  $days['default']    = $default;
                 
                  end:
                  return $days;
              }
             
              /**
               * @param    string, string, string
               * @return   array
               */
              protected function setMonths(string $type = "full", string $keyType = "numeric", string $default = ''){
                  $keys = array(
                      'numeric' => array(
                          "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"
                      ),
                      'full'    => array(
                          "January", "February", "March", "April", "May", "June", "July",
                          "August", "September", "October", "November", "December"
                      ),
                      'short'   => array(
                          "Jan", "Feb", "Mar", "Apr", "May", "Jun",
                          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
                      )
                  );
                  $months   = array();
                  $index   = 0;
                  foreach($keys[$keyType] as $primaryKey){
                      $months[$primaryKey]  = $keys[$type][$index];
                      $index++;
                  }
                  if($default = ''){
                      goto end;
                  }
                  $months['default'] = $default;
                 
                  end:
                  return $months;
              }
             
              /**
               * @param    int, int, string
               * @return   array
               */
              protected function setYears(int $start = 1977, int $end = 2017, $order = "asc"){
                  $years    = array();
                  if($order == "asc"){
                      for($i = $start; $i <= $end; $i++){
                          $years["{$i}"]  = $i;
                      }
                      goto end;
                  }
                  for($i = $end; $i >= $start; $i--){
                      $years["{$i}"]  = $i;
                  }
                 
                  end:
                  return $years;
              }
          }
          up
          0
          David Gimeno i Ayuso info at sima dot cat
          27 days ago
          Goto isn't too advisable but sometimes it's a clearer solution than an if clause with a large number of instructions inside.

            if ($error):
              goto ExitFunction;
            endif;
            ... a good bunch of lines ...
          ExitFunction:

          Anyway, what I would like to comment is maybe a gosub or perform operator will be useful too.

          Many times I needed to create a separate function and pass a lot of variables to it just because there is a set of instructions I need to repeat in some parts of a process or function.
          up
          0
          annoymous
          5 months ago
          goto will be easy to use but also will be very easy to spoil your function so use it carefully.
          up
          -1
          romeu at gamelas dot pt
          5 months ago
          This function despite it's bad name is pretty useful and the most CPU effective in to control a flow of multiple cascading situations.
          Let's say you have some form set, but before it you need to perform a lot of checks on which form to show based upon user permissions or settings:
          <?php
          $user_info
          = ...; //something you get before from session, cookies, database...
          if($user_info != "already_set"){
            
          //Some setting need isn't yet done
            
          loadForm("form1");
          }else{
           
          //OK, the set was done, so let's continue
           
          if($user_info != "some_other_thing"){
            
          //Another thing missing...
            
          loadForm("form2");
          }else{
          //OK, the second part is done, let's do the third...
            
          if($user_info != "some_yet_another_thing"){
             
          //And yet another thing to setup...
             
          loadForm("form3"); 
             }else{
               
          /* Guess you can see the picture now, it will be if(){ else if(){ else if(){ else....}}}}}}}}
            }
          }
          }
          ?>

          Goto can handle this situation like:
          <?php
          if($user_info != "already_set") {
              loadForm("form1");
              goto move_on;
          }
          if($user_info != "some_other_thing") {
              loadForm("form2");
              goto move_on;
          }
          if($user_info != "some_yet_another_thing") {
              loadForm("form3");
              goto move_on;
          }

          move_on:
          ?>

          Preventing all other CMP instructions at the cascade with a simple JMP, "Assemblying speaking"
          up
          -10
          kle at lekhoi dot com
          2 years ago
          Goto can also go into an infinite loop as the example below.

          <?php

          goto start;

          start: echo 'start';

          working: {
              echo
          'working';
              ...
              goto
          start;
              echo
          'never executed';
          }
          ?>

          Output
          startworkingstartworking ...
          up
          -5
          Mark
          1 year ago
          Here are two examples of how GOTO can simplify code and actually make it more readable and easier to understand.

          1. GOTO can be used to exit an IF block:

          <?php
             
          if(something) {
                  if(
          nothing) goto endif;
                 
          //    blah blah
                  //    blah blah
                 
                 
          endif:
                     
          // Nothing here, but maybe some cleanup
             
          }   
          ?>

          2. GOTO can be used to jump ahead to a section of code. This can be useful for trouble shooting or testing a script in small stages.

          <?php
             
             
          goto block3;
             
             
          block1:
                 
          //    blah blah
             
             
          block2:
                 
          //    blah blah
                 
             
          block3:
                 
          //    blah blah
          ?>

          Note that in both cases, I have gone forward, not backward. This makes it more manageable.

          In the case of the IF block, many structures, such as a loop, a switch or a function, have an early exit, such as break or return. IF doesn’t, so this is a workable solution
          up
          -16
          ivan dot tc at gmail dot com
          3 years ago
          This works good:

          <?php
          goto start;

          five:
          echo
          $i;
          goto
          end;

          start:
          echo
          'I have ';

          for (
          $i=0; $i < 10; $i++) {
            if (
          $i == 5) {
              goto
          five;
            }
          }

          end:
          echo
          ' apples';
          ?>

          Output: I have 5 apples.

          This don't work:

          <?php
          goto start;

          five:
          echo
          $i;
          goto
          end;

          start:
          echo
          'I have ';
          $count();

          end:
          echo
          ' apples';

          $count = function () {
            for (
          $i=0; $i < 10; $i++) {
              if (
          $i == 5) {
                goto
          five; // line 18
             
          }
            }
          }
          ?>

          PHP Fatal error:  'goto' to undefined label 'five' on line 18
          up
          -57
          ivan dot sammartino at gmail dot com
          3 years ago
          I found it useful for switch statements:

          <?php
          $action
          = $_GET['action'];
          switch (
          $action){
              case(
          'a'):
                 
          mylabel: {
                     
          doStuff();
                      break;
                  }
              case(
          'b'):
                  if (
          true){
                     
          doAnotherStuff();
                  } else {
                      goto
          mylabel;
                  }
                  break;
          }
          ?>

          備份地址:http://www.lvesu.com/blog/php/control-structures.goto.php

          国产成人午夜福利r在线观看_欧美性受xxxx孕妇_白丝娇喘过膝袜爽短裙调教_jizz jizz xxxx