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>".
goto
goto işleci betik içinde başka bir komuta atlamak için kullanılabilir. Hedefin yeri, bir yafta ve ikinokta imi ile belirtilebilir. goto bu yaftaya göre hedefi bulur. Bu, goto deyiminin tamamen sınırsız olduğu anlamına gelmez. Hedef yaftasının aynı dosya ve aynı bağlam içinde kalması gerekir, yani bir işlev veya yöntemin dışına atlayamayacağınız gibi bir başka işlev veya yöntemin içine de atlayamazsınız. Ayrıca bir switch veya döngünün içine de atlayamazsınız, fakat bunların dışına atlayabilirsiniz, yani çok seviyeli bir break yerine bir goto kullanabilirsiniz.
Örnek 1 - goto örneği
<?php
goto a;
echo 'Foo';
a:
echo 'Bar';
?>
Yukarıdaki örneğin çıktısı:
Bar
Örnek 2 - Döngüden goto ile çıkma örneği
<?php
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
if($j==17) goto end;
}
}
echo "i = $i";
end:
echo 'j hit 17';
?>
Yukarıdaki örneğin çıktısı:
j hit 17
Örnek 3 - Bu çalışmaz
<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
loop:
}
}
echo "$i = $i";
?>
Yukarıdaki örneğin çıktısı:
Fatal error: 'goto' into loop or switch statement is disallowed in script on line 2
Bilginize:
goto işleci PHP 5.3'ten beri kullanılabilmektedir.
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.
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';
?>
goto operator can NOT be evaluate with eval()
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;
?>
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;
}
}
}
?>
