PHP'de <? = Etiketini kullanmak kötü bir uygulama mı?


189

<?= ?>Son zamanlarda bu PHP etiketine rastladım ve kullanmak konusunda isteksizim, ama o kadar zor kaşınıyor ki, üstesinden gelmeni istemiştim. Ben kısa etiketlerini kullanmak kötü bir uygulamadır biliyoruz <? ?>ve biz tam etiketlerini kullanması gerektiğini <?php ?>bunun yerine, ama ne kimse bu konuda: <?= ?>?

Bazı yazımları koruyacak ve kodun okunabilirliği IMO için daha iyi olacaktır. Yani bunun yerine:

<input name="someVar" value="<?php echo $someVar; ?>">

Daha temiz olan şöyle yazabilirim:

<input name="someVar" value="<?= $someVar ?>">

Bu operatörün kullanımı kaşlarını çattı mı?


11
Bu tür bir soru ile ilgili sorun, bu kadar tartışılmış olmasıdır. Orada "teknik olarak" doğru ya da yanlış bir yol yoktur. Bazıları, bazılarına karşı, hepsinin tercihi olduğunu iddia eder. Sonunda size kalmış.
mseancole

Herhangi bir biçimde kapanış etiketini kullanmaktan kaçının - mümkünse, dosya sadece php kodu içeriyor (html yok). Bir kapanış etiketiniz varsa, tarayıcıya çıktıktan sonraki karakterler (bir web uygulaması için) - bu hata ayıklamada çok zor olabilir. Daha fazlası için: stackoverflow.com/a/4453835/49560
dharm0us

İlgili olmayan görüş çünkü: Dikkat et echosatışlar çok kolay XSS için ve daha iyi bağlama adanmış yankılanan yöntemine güvenmek gerekir (yani: Bir olan function html($x) { echo htmlentities($x,...); }ve un html($someVar);yerine echo $someVarkullanarak veya echo json_encode($x);JS bağlam için). Bu daha sonra <?=etiketleri kötü bir uygulama haline getirir, çünkü değişken içeriğin HTML içeriğinden başka bir yerde kaçtığını gösterir ve başka bir yerde bu değişkenin HTML bağlamında yankılanması nedeniyle sihirli biçimde HTML'den kaçması gerektiğini bilmesi gerekir.
Xenos

Yanıtlar:


210

Tarih

Yanlış bilgilendirme treni istasyonun dışına çıkmadan önce, PHP kısa etiketleri hakkında anlamanız gereken birçok şey var.

PHP'nin kısa etiketleriyle ilgili temel sorun, PHP'nin <?başka bir sözdizimi olan XML tarafından kullanılan bir etiketi ( ) seçmeyi başarmasıdır .

Bu seçenek etkin durumdayken, xml bildirimini sözdizimi hatası almadan ham çıktı elde edemezsiniz:

<?xml version="1.0" encoding="UTF-8" ?>

XML ayrıştırma ve yönetiminin ne kadar yaygın olduğunu dikkate aldığınızda bu büyük bir sorundur.

Ne hakkında <?=?

Her ne kadar <?xml ile çakışmalara neden olsa da , <?= yok . Ne yazık ki, açma ve kapatma seçeneklerine bağlıydı short_open_tag, bu da kısa yankı etiketinden ( <?=) faydalanmak için kısa açık etiketin ( <?) sorunlarıyla uğraşmanız gerektiği anlamına geliyordu . Kısa açık etiketle ilgili sorunlar kısa yankı etiketinin sağladığı avantajlardan çok daha büyüktü, bu nedenle short_open_tagkapatmanız gereken bir milyon buçuk öneriyi bulacaksınız .

PHP 5.4 ile, ancak kısa eko etiketi short_open_tagseçeneğinden ayrı olarak yeniden etkinleştirildi . Bunu <?=, kendi içinde kendisinde temelde yanlış bir şey olmadığı için, kolaylığının doğrudan bir onaylaması olarak görüyorum .

Sorun şu ki <?=, daha geniş PHP sürümlerinde çalışabilecek kod yazmaya çalışıyorsanız, sahip olacağınızı garanti edemezsiniz .

tamam, şimdi her şey yolunda değil

Kullanmak mı <?=?

short echo etiketinin kullanılıp kullanılmayacağına ilişkin akış çizelgesi


70
Senin çabuk diyagramına katılmıyorum. Doğru cevap % 99.99'tur, çünkü çoğu üretim ortamı kısa etiketler kullanmak üzere yapılandırılmıştır. Size farz patladı ve onlar kaldırmak <?=size sadece bir proje genelinde arama yapmak & iætirilme olursa olsun dosyaların binlerce bunları nasıl kullandığımız, bir dakikadan az bir tamir edebiliriz gelecekte <?=için <?php echo . Benim cevabım endişelenmeyin ve sadece kullanın , faydaları büyük ölçüde sonuçları kilo. <?=artık kısa bir etiket olarak görülmüyor, Rasmus Lerdorf da bunu çok taahhüt etmiş.
dukeofgaming

32
@dukeofgaming, kısa etiketler kullanmak üzere yapılandırılmış üretim ortamları hakkındaki verilerinizi nereden alıyorsunuz? Bunları devre dışı bırakmak, duyduğum en yaygın önerilen yapılandırmalardan biridir, ikincisi yalnızca sihirli tırnakları devre dışı bırakmak içindir. Ayrıca, üretimden farklı bir dev ortamının olması kesinlikle sıfır anlamlıdır.
zzzzBov

4
Kısa etiketler 5.3'e kadar varsayılan olarak etkindi. Php.net/manual/en/ini.core.php#ini.short-open-tag , tanıdığım çoğu barındırma hizmeti sorunsuz destekledi ve bu Kohana çerçevesinin nedenlerinden biriydi teşvik etmek için kullanılır. <?=her zaman açık olacaktır ( stackoverflow.com/a/6064813/156257 ) ve çoğu zaman açık oldukları zaman. Sen eğer ev sahibi ile kontrol ederek beni yanlış kanıtlayabilirim: bunlar devre dışı bırakılır ve PHP <5.3 kullanarak ve onlar ayar kullanıcılar tarafından ya da özel istek üzerine overriden izin vermez eğer; önceki tüm yanlış ise, elbette endişelenmek <?=.
dukeofgaming

6
<?=Kaldırılacak endişeli değilsiniz ve ben de değilim. Diğerleri olabilir ve eğer öyleyse kullanmak zorunda kalmazlar <?=. Bazı insanlar bazı dil özelliklerini kullanma konusunda irrasyonel korku duyuyorlar ( php'de etiketleri kapatmak gibi ).
zzzzBov

8
Bu tam olarak benim açımdan: endişelenmenize gerek yok . Sadece "Endişeleniyor musun?" Koyardım. --yes -> "Devam et ve onları kullan, endişelenmene gerek yok". Ayrıca kapanış etiketlerini bırakmanın kötü bir uygulama olduğunu ima ediyormuş gibi hissediyorsunuz.
dukeofgaming

28

PHP şapkamı tozlamak

Ben kesinlikle <?= $someVar ?>daha ayrıntılı echo(sadece kişisel tercih) üzerinde kullanmayı tercih ediyorum . Sadece olumsuz AFAIK durumda olan ön-5.4.0 çalıştıran kullanıcılar içindir short_open_tagetkin olmalıdır php.ini .

Şimdi söylemiştim, eğer projeniz işletim sistemi değilse, o zaman tartışma konusu. Öyleyse, short_open_tagetkinleştirilmesi gerektiği gerçeğini belgeleyebilirim ya da iki çözümden daha fazla taşınabilir kullanacağım.


1
Nitpick: PHP 5.4'ten <?=etkilenmese de short_open_tag, <?yine de ve kısa form etiketlerini kullanma alışkanlığınız varsa, hangi sürümde desteklendiğini unutmak oldukça kolaydır.
yannis

7
@YannisRizos <?=Şablon tarzı kullanım için "Şimdi bir değişken veriyorum" ve <?php"Şimdi çok fazla kod çalıştırıyorum" olarak ayırt etmek iyidir . Kullanmak asla öneririm <?, ancak her iki o <?=ve <?phpiyi.
Izkata

2
+1, çünkü Rasmus Lerdorf, steno <? = Etiketini onaylıyor. Görüşmelerinden birini (daha sonra yayınlanacak) PHP 5.4'ü izledim. Bu nedenle, PHP 5.4.0'dan beri <? = Etiketi her zaman kullanılabilir durumdadır. PHP 5.4 öncesi bir çok kod gördüm; <? = Etiketi bir MVC uygulamasının görünümünde kullanılıyordu ama görünüm dışı dosyalarda <? Php ...?> Kullanılıyordu.
programcı

@ Jason Bu söylediğim şey değil. “Rasmus, fooyu onaylıyor” argümanı değil , “Rasmus bunun için ve bu nedenle fooyu onaylıyor”.
yannis

2
@Yannis Rizos "Rasmus, bunun için fooyu onaylıyor ve bu nedenle". Dilekçe için teşekkürler, ama benim mantığım Rasmus Lerdorf'un onayladığı, dilin yaratıcısı olduğu ve hala PHP'nin gelişimini etkilediği için <? = Etiketini her zaman kullanılabilir kılmak için değişiklikler yapıldı. Özgün yorumuma ekleyeceğim şey budur: "Bu nedenle, <? = Görünümlerinde kullanma uygulaması muhtemelen daha da yaygınlaşacaktır." Dang, şu an için yorumlarımı üç kez kontrol etmem gerekecek ... noktalar ...
programcı

21

Kesinlikle o olsun, kısa form etiketleri önlemek için çalışmalısınız <?ya <?=.

Temel teknik sebep taşınabilirlik, kısa form etiketlerinin verilen her kurulum için çalışacağından asla emin olamazsınız, kapatıldıkları için, short_open_tagdirektife bakın. Ancak, uzun formun her yerde çalışacağından her zaman emin olabilirsiniz.

Bazı yazımları koruyacak ve kodun okunabilirliği IMO için daha iyi olacaktır.

Bu da kötü bir alışkanlık. Size neyi daha okunaklı bulduğunuzu gerçekten söyleyemem, ancak ateşle kod okuma özelliğini kendinize birkaç tuşa basmak için bir bahane olarak kullanmaya karşıyım. Okunabilirlik konusunda endişeleriniz varsa, şurada bir şablon motoru kullanmalısınız:

<input name="someVar" value="{someVar}">

iki örneğinizden çok daha okunabilir.

Son olarak, kısa form etiketlerinin PEAR ve Zend Framework gibi büyük PHP projeleri tarafından açıkça önerilmediğine dikkat çekmek gerekir .


14
Şablonlar için +1. Taşınabilirlik için -1. Onun bir sunucu tarafı dili. Bir sunucu için odaklanmanız gereken zorluklar ölçeklenebilirlik ve güvenlik gibi şeylerdir. Birden fazla platformda çalışacağından emin olmak için ciddi zaman
harcamak

3
@ Stargazer712 Hm? Yapmanız gereken tek şey standardını kullanmaktır <?phpve echoyerine <?ve <?=sen bu kadar ciddi zaman saymak mı? Projenizi, nedense kısa etiketlerin devre dışı bırakıldığı bir sunucuya taşıdığınızda ne olur?
yannis

13
@Yannis: Bu birkaç karakter pek görünmüyor olabilir ama IMO çok fazla ses katıyor.
kevin cline

8
Bence PHP'nin asıl amacının şablon dili olmaktan bahsedilmesi gerekiyor . PHP üzerine başka bir şablon motor (daha fazla şişkinlik) eklemek ton balığı teknemi yüzmüyor. PHP'yi HTML ile karıştırırken kodlama yaparken iyi uygulamaları takip edin (bazı iyi ipuçları burada stackoverflow.com/questions/62617/… ).
programcı

2
@Yannis Rizos Evet, çünkü PHP'de yeni insanlar saf PHP kullanmayı düşünmeden PHP projelerinde [whizbang] template motorunu kullanmak zorunda olduklarını düşünebilirler. Perl'de sadece metin işleme yapmalı mıyım , belki de yapmamalıyım ama şimdi Perl'in de metin işlemede oldukça iyi olduğunu düşünüyorum - aynı şekilde PHP ve şablonlamada.
programcı

15

PHP-Belgeler açıkça kısa eko etiketleri güvenle kullanabilirsiniz söylüyor:

5.4.0 The tag <?= is always available regardless of the short_open_tag ini setting.

Bu PHP 5.4 ve daha üstü sürümler için olsa da herkes en azından bunu kullanmalı. Onları sadece cazip amaçlar için tercih ederdim.


10

Kısa etiketleri kullanma nedenleri:

  • Onlar daha kısa.

Nedenleri değil kısa etiketlerini kullanarak:

  • Bir tane daha yapılandırma uyarlaması getirdiler - çoğu zaman sunucuyu profesyonel bir bağlamda kontrol ederken, kodunuzu genel halka açıklamayı planlıyorsanız, kısa etiketler onu kullanan, yani paylaşılan barındıran kullanıcılar için tamir edilemez bir şekilde bozulabilir .
  • Sterilize edilmemiş dizgileri çıktınıza rasgele düşürmeyi çok kolaylaştırır. Bu korkutucu çünkü XSS açıklarına neden olabilir. Uzun etiketler bunu engellemek için doğrudan hiçbir şey yapmazlarsa da, programcıya belki yaptıklarının doğru olan şey olmadığını işaret ederler ve şu anda kendileri için HTML kodlamasını otomatik olarak yapan bir şablon sistemi kullanmaya başlamalıdırlar . Uzun etiketlerle dinamik karakter dizileri çıkarmak ağrılıdır, ki bu iyi (eğitici) bir şeydir.

IMO'yu kabul etmenin cevabı bu, hatta tho şablonlar her şeyi XSS'nin güvenli hale getirmesini sağlamaz (bir betiğin src özniteliğindeki kullanıcı verileri her zaman güvensiz olur) ve şablon mekanizmasının doğru yankılama içeriğinin farkında olup olmadığını bilmiyorum; PHP değişkeni bir script etiketi içeriğinde biterse ne olur? HTML’ye gömülü bir SVG’de?
Xenos

@ Xenos açıkça söz konusu şablon sistemine bağlıdır ve gümüş mermi yoktur; ancak birçoğu böcek yüzeyini ve manuel çalışmanın (en önemli güvenlik hataları kaynağı) gerekli olduğu senaryo sayısını azaltır. "Dinamik içeriği komut dosyası etiketlerine koymayın", "tüm dinamik içeriğin her yerde düzgün bir şekilde HTML kodlu olduğundan emin olun" ifadesinden daha kolaydır (ve denetlenir).
tdammers

4

Ben düşünüyorum <?=sürümü sadece değişkenlerin nihai çıktısı için kullanmak ve doğrudan ilgili olmayan herhangi bir işlev-aramaları veya üçlü-mantık kaçınmak şartıyla bir iyi / kabul edilebilir bir uygulama olduğu sunum verilerinin.

Kesinlikle <? echo($x); ?>her yerden çok daha iyi .

Uzun vadeli, Smarty gibi şablonlama motorlarına bakmak isteyebilirsiniz .


3
Smarty zamanlar şablon motoru, ama şu anda modası geçmiş ve şişirilmiş karmaşa ve gerçekten sakınmak gerekir.
yannis


-3

Dürüst olmak gerekirse, yöntem ne olursa olsun (eski veya yeni moda) bir sonuç yankılanmanın MVC zaten 33 yılını kutlarken oldukça eski bir şey olduğunu düşünüyorum.

Evet, bu, gelen sunucu (php) verilerini bir XML belgesinin içine yerleştirmek ve onu uygulama / müşteri katmanınıza işlemek, böylece böyle bir etiketi kullanma fikrinden tasarruf etmek için iyi bir uygulamadır.


1
Aslında MVC 33 yılını kutladı, ilk olarak Aralık 1979'da bu yazıda belirtildi .
yannis

evet, hala 2000
yaşındayım

1
um ... Temprating ... temprating modası geçmiş mi? Şablonlama ve MVC birbirini dışlar mı?
Tim Seguine 30:15
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.