2013-10-04 13 views
7

Czy istnieje sposób zdefiniowania globalnej etykiety (coś jak zmienne) dla PHP goto, aby użyć jej wewnątrz deklaracji funkcji. Chcę wykonać następujące czynności:użyj goto wewnątrz funkcji php

function myFunction() { 
    if (condition) { 
    goto someLine; 
    } 
} 


someLine: 
// .... 

myFunction(); 

kiedy używam tego kodu mówi

PHP Fatal error: 'goto' to undefined label "someLine" 

wiem, że nie zaleca się stosowania goto oświadczenie. Ale potrzebuję tego w moim przypadku. Wiem, że może zawsze istnieją alternatywy goto, tylko w moim przypadku byłoby to uczynić kod trochę łatwiejszy i zrozumiałe

+0

Więc chcesz wyjść poza funkcję? To nie jest możliwe. Co próbujesz osiągnąć? – Jim

+0

@ Jim, muszę sprawdzić warunki wewnątrz funkcji i na ich podstawie przejść do konkretnej linii. Dzięki – dav

+0

Czego używasz tego * do *? Niemal zawsze istnieje alternatywa dla używania goto. – Jim

Odpowiedz

6

Możesz nie goto poza funkcją wierzę: http://php.net/manual/en/control-structures.goto.php

Cytat Direct: Jest nie pełne nieograniczone goto. Etykieta docelowa musi znajdować się w tym samym pliku i kontekście, co oznacza, że ​​nie można wyskoczyć z funkcji lub metody ani nie można przeskoczyć do jednej.

Może to wynikać z faktu, że php jest analizowany, a wyskakiwanie z funkcji spowoduje wyciek pamięci lub coś, ponieważ nigdy nie zostało poprawnie zamknięte. Jak wszyscy inni mówili powyżej, naprawdę nie potrzebujesz goto. Możesz po prostu zwrócić różne wartości z funkcji i mieć warunek dla każdego. Goto to po prostu bardzo zła praktyka dla nowoczesnego kodowania (dopuszczalne, jeśli używasz podstawowego).

Przykład:

function foo(a) { 
    if (a==1) { 
     return 1; 
    } elseif (a==3) { 
     return 2; 
    } else { 
     return 3; 
    } 
} 

switch (foo(4)) { //easily replaceable with elseif chain 
    case 1: echo 'Foo was 1'; break; //These can be functions to other parts of the code 
    case 2: echo 'Foo was 3'; break; 
    case 3: echo 'Foo was not 1 or 3'; 
} 
2

Nie ma sposobu, aby przejść do lub z funkcji. Ale ponieważ twierdzisz, że tego potrzebujesz, oto alternatywna trasa.

function myFunction() { 
    if (condition) { 
    return true; 
    } 
    return false; 
} 


someLine: 
// .... 

$func = myFunction(); 
if($func == true) goto someLine; 
+0

tak, ta alternatywa też mi się podoba, ale warunki mojej funkcji są nieco skomplikowane a użycie funkcji goto wewnątrz ułatwiłoby kod. Dzięki – dav

+2

Nie chodzi o to, jak "łatwy" jest kod w tym przypadku. Nie ma innej opcji poza programowaniem rzeczy we właściwy sposób - co oznacza NIE używanie goto. – BetaBlaze

2

Jak wcześniej wspomniano, nie można. Jeśli chodzi o "Potrzebuję tego", bardzo w to wątpię. Bez względu na to, jaki kod masz w SomeLine: możesz łatwo przekształcić go w funkcję, z której możesz zadzwonić z drugiej, jeśli zajdzie taka potrzeba.

0

tak istnieje sposób, tak długo, jak funkcja jest zadeklarowana w tym samym pliku php lub jest włączone, jeśli jej na innym skrypcie

najlepszym sposobem, aby przejść do someline jest powrót tego kodu goto twój koleś tak, że jeśli funkcja jest wywoływana, otrzymywana jest wartość zwracana .. mam nadzieję, że to pomaga

function foo($b="30") 
{ 
$a=30; 
if($a==intval($b)) 
return "someline:goto 
someline"; 
} 

try{ 
eval(foo()); 
} 
catch(IOException $err) 
{ 
exit($err); 
} 

/*someline is somewhere here 
for example */ 
+0

możesz nie robić goto z funkcji do someline poza sobą, ale możesz zamiast tego zwrócić eval lub po prostu zwrócić prosty ciąg znaków "goto someline", ale upewnij się, że oceniasz swoje wywołanie funkcji jak eval (foo()): where foo wraca do goto, myślę, że to działa lepiej –