PHP ve PHP 5.3 eklenecek Goto deyimi

12 Cevap php

"Goto" deyimi düz ASM ya da diğer herhangi bir assembler dilinde çıkıyor.

İşte link: http://be2.php.net/manual/en/control-structures.goto.php

I'm wondering: what can this do to make my code more well-organized? How can I implement this in larger projects, without screwing it up. Since the goto will allow you to jump back and forth, accidental assignments and infinite loops are waiting to happen if you use this the wrong way.

Birisi bana bu bir iyi kullanmak bir örnek verebilir misiniz?

EDIT: tamam, ben cevapların bazılarını gördüm ve görünüşe göre geniş bir konsensüs "goto" ifadesinin kullanımı hakkında var ve kötü olmak.

Yani ben hala merak ediyorum: Neden PHP dili eklemek için rahatsız olur. Onlar bir şey görmedim, onlar bunu ... neden olmasın ki?

Ayrıca: A discussion here on StackOverflow about "goto" in general

EDIT2: Bu soru Goto deyimi hakkında üzgün olmak için kötü bir çok şey kaynaklı olarak gören, ben gittim ve babama sordum. O 52 yaşında ve bir Endüstri Mühendisi. Kendisinin gün içinde ve çoğunlukla FORTRAN ve COBOL programlama iyi bir miktar yaptım bana bir kaç kez söyledim />

Anyways, he said some stuff about "back in my day..."
After discussing that a bit, he came back to the goto statement, saying that even back in his days as a student, they allready knew it wasn't a smart idea to use it, but they didn't have much better back then. Try/catch was still years away and error handling hardly excisted.
So what did you do to check your program? Add a few lines at the end that allow you to print output and everything you need to check in your code, and then you place the line: "goto printing;", or something like that, to start the printing of your data.

Ve bu şekilde, yavaş yavaş kodunuzu ayıklanmış.

O modern programlama dünyada goto kullanımı oldukça yararsız olduğunu kabul eder. O haklı bulduğu tek kullanım aşırı hata ayıklama ve beklenmedik durumlarda kullanılmak üzere bir "acil durum break", olduğunu. Kinda goto fatal_error; gibi, ve kod "fatal_error" kısmını derinlemesine sonuçları göstermek için bazı şeyler var.
Ama sadece bir şey oluşturulması sırasında. Bir mamul Goto-ifadeler olmamalıdır.

GEÇ DÜZENLEME: Another discussion about "goto" in PHP5.3/PHP6

12 Cevap

Eğer iyi bir PHP kodu yazıyorsanız, goto kullanmak gerekmez. Ben bunu sadece tembel programlama açar gibi onlar, bunu da ekleyerek olduğumuz bir hata olduğunu düşünüyorum.

Görmek

http://www.procata.com/blog/archives/2004/07/29/goto-in-php/

Aynı zamanda iyi bir PHP bu ek hakkındaki yorumların ve için, burada yığın taşması üzerine,

http://stackoverflow.com/questions/46586/goto-still-considered-harmful

Ben sadece hiç goto için iki kullanır bulduk:

  1. Iç içe döngüler çıkmak. Ancak en yeni diller goto zaten bunu yapmak için mekanizma (PHP break <number>, ya da break <loop label> Java, vb) var.
  2. Bir fonksiyonun sonunda bir temizleme bölümüne gidin. Fakat yine de, bu çoğu zaman bir çöp toplanan dilde yararlı değildir.

Eğer bir şey için goto kullanmalısınız olup olmadığını bilmiyorum, başka bir deyişle, olmamalıdır.

Goto gibi iyi kullanmak böyle bir şey yoktur.

Belki, sadece belki, birden fazla iç içe döngüler çıkmak için yararlı olabilir, ama zaten "2 kırmak" ve bu tür kullanarak bunu yapabilirsiniz. Java gibi etiketli sonları bu amaç için Goto daha iyi olurdu.

Bir zamanlar başarısız tabloların bir demet sonuna atlamak için gerektiğinde Belki, istisnaları kullanmadan da yazılı kodu ile yararlıdır. Ama bu sadece daha berbat kodu ile berbat kod tamir ediyor.

Eğer iş akışı dışarı veya sadece geçici bir değişiklik kod blokları refactor gerekmez böylece hata ayıklama amaçları için kullanılabilir.

Klasik VB kodlama, goto kullanımı bu gibi işleme try / catch hata taklit için kullanışlı:

Function MyFunction() as String

'-- start of error block
'
 On Error Goto Catch
   ' do something here that might cause an error
   MyFunction = "IT WORKED"
   Exit Function

 Catch:
   ' error occured - do something else
   MyFunction = Err.Description

 '
 '-- end of error block

End Function

... and here is a way to emulate the try/catch/finally ..

Function MyFunction() as String

'-- start of error block
'
 On Error Goto Catch
   ' do something here that might cause an error
   MyFunction = "IT WORKED"
   Goto Finally

 Catch:
   ' error occured - do something else
   MyFunction = Err.Description
   Err.Clear

 Finally:
   ' put your finally code here

 '
 '-- end of error block

End Function

I başka bir fonksiyonu o temizlik yapmak denebilecek bir durum yaratabilir varsayalım rağmen aynı zamanda, bir fonksiyonun sonunda temizliği için yararlı olabilir.

Tüm dürüstlük, ben 'hmm, ben goto ifadesi olsaydı' diye düşündüm PHP bir fırsat yoktu. Ben onlar bunu yapmak için karar neden kadar okumak değil, ama, bu adamlar oldukça akıllı ve şimdiye kadar çok iyi yönleri içine PHP almış, bu yüzden belki de biz henüz farkında değilsiniz ihtiyaç bekliyorlar.

Bir dil Gotos sahip bkz ana kullanım dilleri arasında bağlantı noktasına yeteneğidir. Ben (daha aklı başında kontrol yapılarını uygulamak için daha Gotos kullanımı kolay oldu çünkü) Gotos ile ayrıştırıcılarını oluşturulan C bir ayrıştırıcı jeneratör yazdı ve şimdi PHP için taşıma bir baş ağrısı olarak fazla değildir.

Sonlu durum makineleri yazarken Goto öncelikle kullanılır. Bağlam serbest dilbilgisi ayrıştırma zaman aslında onlardan birine ihtiyacınız olacak. continue $case;, farklı bir durumda atlamak için bir anahtar blok içinde geçerli bir ifadedir ve ders dışı durumda olan birçok dil günümüzde sahip aralıkları biz Goto olmadan yaşayabilir rağmen. O zamana kadar hemen hemen Goto ile sıkışmış.

Goto aşağıda yalancı kod, yığın gevşemek için kod tekrarını azaltmaya yardımcı olabilir:

do A
if (error)
    goto out_a;
do B
if (error)
    goto out_b;
do C
if (error)
    goto out_c;
goto out;

out_c:
undo C

out_b:
undo B:

out_a:
undo A

out:
return ret;

(Linux kernel arşiv posta listesinden alınan Robert Aşk tarafından sözde kod: http://kerneltrap.org/node/553/2131#node-553)

Daha önce söylendiği gibi, Goto algoritmalar, dil ayrıştırma veya sonlu durum makinelerinin gelip, genellikle bu bazı türlerinde required sadece gerçekten. Ben PHP goto eksikliği kaçırmadım.

SNOBOL4: OTOH, ben sadece iki yapı fonksiyonları ve koşullu Gotos olduğu bir dilde programlanmış. Spagetti kod riski çok yüksek olduğu için, çoğu SNOBOL4 programcı / önlemek için dikkatli edilir idi. Ama Gotos böylece bazı çok sıkı programlama, yaratıcı döngü infaz ve etkinleştirin yaptım. Eğer tüm Gotos iseniz FSM-tipi döngüler yapmak aslında biraz daha kolay bulunuyor.

Benim kodları olarak goto hiç kullanmamış itiraf. :)

Benim için tek nedeni PHP diğer dillerden kısa göç güzergahı (hemen hemen sadece kontrol yapılarının dokunmadan dilini değiştirmeyi) kolaylaştırmak ve aktarımın 2. sahnede kod refactor gibi görünüyor.

Şahsen ben koşullu break-s döngüler önleyebilirsiniz eğitimli meslektaşları gibi inanıyorum, onlar Goto günaha karşı mümkün olacaktır.

Oluşturulan kod goto iyi faydalanmak olabilir, sanırım. Oluşturulan kodu hakkında iyi bir şey onu korumak gerek kalmamasıdır - sadece onu yeniden.

Bu dilde ve bağlı iyi programlama uygulamaları eskimiş yapılıyor olacağını rağmen goto gerçekten bir şey olmalı. Şimdi ekleme geriye bir adım gibi görünüyor.