downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Функции> <include_once
[edit] Last updated: Fri, 25 May 2012

view this page in

goto

(PHP 5 >= 5.3.0)

Оператор goto используется для перехода в другую часть программы. Место, куда необходимо перейти указывается с помощью метки, за которой ставится двоеточие, после оператора goto указывается желаемая метка для перехода. Оператор не является неограниченным "goto". Целевая метка должна находиться в том же файле, в том же контексте. Имеется ввиду, что вы не можете ни перейти за границы функции или метода, ни перейти внутрь одной из них. Вы также не можете перейти внутрь любой циклической структуры или оператора switch. Но вы можете выйти из них, и обычным применением оператора goto является использование его вместо многоуровневых break.

Пример #1 Пример использования goto

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

Результат выполнения данного примера:

Bar

Пример #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

Пример #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

Замечание:

Оператор goto доступен в PHP начиная с версии 5.3.

Что наихуджее может случиться, если используется goto ?
Изображение предоставлено » xkcd



Функции> <include_once
[edit] Last updated: Fri, 25 May 2012
 
add a note add a note User Contributed Notes goto
roman4work at gmail dot com 09-Apr-2012 03:36
since label executes all the time even if you don't use goto label;

<?php

if (false)
  
goto label

label
:
   echo
"label triggered";

?>

Will output: label triggered

I use labels like this

<?php

...some code...

if (
false) {
  
label1 :
      echo
"label 1 triggered";
}

if (
false) {

  
label2 :
      echo
"label 2 triggered";
}

if (
false) {

  
label3 :
      echo
"label 3 triggered";
}

?>

It will never output unless you use "goto <label>".
f at francislacroix dot info 30-Nov-2011 01:11
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.
Ray dot Paseur at Gmail dot com 27-Oct-2011 06:59
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';
?>
contact at xpertmailer dot com 07-Jul-2011 06:08
goto operator can NOT be evaluate with eval()
tweston at coldsteelstudios dot com 05-Oct-2010 08:12
In a challenge of myself for a college class I decided to use the goto to remove all while loops from my code. It was actually easy, and AS FAST as While loops.

<?PHP
$start
= microtime(true);
$i = 0;
StartOfLoop:
$i++;
if(
$i < 1000000) goto StartOfLoop;

echo
microtime(true) - $start.PHP_EOL;

$start = microtime(true);
$i = 0;
while(
$i < 1000000){
   
$i++;
}

echo
microtime(true) - $start.PHP_EOL;
?>
chrisstocktonaz at gmail dot com 07-Aug-2009 03:03
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;
        }
    }
}
?>

 
show source | credits | stats | sitemap | contact | advertising | mirror sites