2013-10-04 26 views
7

İşlevsel bildirimin içinde kullanmak için goto numaralı PHP için genel etiketi (değişkenler gibi bir şey) tanımlamanın bir yolu var mı? Aşağıdaki yapmak istiyorum:goto iç işlevini kullanın php

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


someLine: 
// .... 

myFunction(); 

Bu kodu kullandığınızda bu

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

Ben goto deyimini kullanmak tavsiye edilmez biliyorum diyor. Ama benim durumumda buna ihtiyacım var. http://php.net/manual/en/control-structures.goto.php

Doğrudan Alıntı:: budur belki her zaman sadece benim durumumda Bunu bir fonksiyonun değil git dışarıda inanabilirim kodu biraz daha kolay ve anlaşılır

+0

Bu mümkün değil. Neyi başarmaya çalışıyorsun? – Jim

+0

@Jim, Fonksiyonun içindeki koşulları kontrol etmeli ve onlara bağlı olarak, belirli bir satıra gitmeliyim. Teşekkürler – dav

+0

Bu * için ne kullanıyorsunuz? Goto kullanmaya neredeyse her zaman bir alternatif var. – Jim

cevap

6

kılacak, goto ait alternatifleri olduğunu biliyoruz sınırsız bir goto değil. Hedef etiket, aynı dosya ve bağlam içinde olmalıdır, yani bir işlevden veya yöntemden atlayamayacağınız veya bir tanesine atlayamayacağınız anlamına gelir. Bu, php'nin ayrıştırılmasının ve bir işlevin atlanmasının bir bellek sızıntısına veya bir şeyin düzgün bir şekilde kapatılmaması nedeniyle bir şeylere neden olacağı gerçeğiyle ilgili olabilir. Ayrıca, herkes yukarıda söylediğim gibi, gerçekten de bir gotoya ihtiyacınız yok. Farklı değerleri işlevden döndürebilir ve her biri için bir koşula sahip olabilirsiniz. Goto, modern kodlama için sadece süper kötü bir uygulamadır (eğer temel kullanıyorsanız kabul edilebilir).

Örnek:

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

veya bir fonksiyonu atlamaya yolu yok. Ama ihtiyacın olduğunu söylediğin için, alternatif bir yol.

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


someLine: 
// .... 

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

evet, bu şekilde benim de bir alternatifim, fakat işlevimin koşulları biraz karmaşıktır. ve goto içindeki işlevi kullanmak kodu daha kolay hale getirirdi. Teşekkürler – dav

+2

Bu durumda kodun ne kadar "kolay" olduğuyla ilgili değil. Şeyleri doğru bir şekilde programlamanın yanı sıra başka bir seçenek de yok - bu, Goto'yu kullanmaman anlamına geliyor. – BetaBlaze

2

Daha önce de belirtildiği gibi yapamazsınız. "İhtiyacım var" konusuna gelince, bundan şüphe duyuyorum. SomeLine'da sahip olduğunuz herhangi bir kod: Gerekirse diğerlerinden arayabileceğiniz bir fonksiyona kolayca yapılabilir.

0

evet bir yol sürece bu işlev aynı php dosyasında bildirilmiş veya eğer dahil olduğu gibi orada onun başka senaryo üzerinde,

someline senin ahbap o git kodunu döndürmektir üzerine atlamak için en iyi yolu Bu nedenle, işlev bir dönüş değeri olarak adlandırılırsa, bu durumun işe yaramasını umarız. Bu, işlevin dışına sıçramak istediğiniz anlamına mı gelir?

+0

bir işlevden kendi dışına someline için bir goto yapamazsınız ancak bunun yerine bir eval döndürün veya basit bir dize dönüşü döndürün "goto someline", ancak işlev çağrınızı eval (foo()) gibi değerlendirdiğinizden emin olun: foo Goto döndürür, bu ahbap daha iyi denemek düşünüyorum –

İlgili konular