Neden yakın etiketi atlamalıyım?


374

Ben ?>dosya sonunda PHP yakın etiketi kullanmak için kötü uygulama okumaya devam . Başlık sorunu aşağıdaki bağlamda önemsiz görünüyor (ve şu ana kadarki tek iyi argüman budur):

PHP'nin modern sürümleri php.ini dosyasında output_buffering bayrağını ayarlar Çıktı tamponlaması etkinse, HTML çıktısını verdikten sonra HTTP üstbilgilerini ve çerezlerini ayarlayabilirsiniz, çünkü döndürülen kod tarayıcıya hemen gönderilmez.

Her iyi uygulama kitabı ve wiki bu 'kural' ile başlar, ancak kimse iyi nedenler sunmaz. Bitiş PHP etiketini atlamak için başka bir iyi neden var mı?


3
[bazı komut dosyalarında neden kapanış php etiketini atladılar?>] ( stackoverflow.com/questions/3219383/… )
Gordon

@Christian - Çıktı_buffering'inin tembel veya tembel bırakmanın ?>tembel olduğunu mu söylüyorsunuz ?
El Yobo

4
@Gordon - Ben bunun bir dup olduğunu sanmıyorum, OP görünüşte sebepleri biliyor, sadece çıktı tamponlama ile tamamen çözülüp çözülmediğini bilmek istiyor.
El Yobo

5
Daha iyi bir soru şu olabilir: Neden yakın etiket dahil edilmeli? Kod kötülüktür. En iyi kod hiç kod değildir. Bir sorun kodla çözülmek yerine ortadan kaldırılabilirse, bu kod sahibi olmaktan daha iyidir. Bu durumda, çözülmesi gereken bir sorun yoktur. Kod, close etiketi olmadan sorunsuz çalışır.
still_dreaming_1

19
Tanrım, bu sekmeler vs boşluklar kutsal savaş, lol için yer değil :)
Kevin Wheeler

Yanıtlar:


322

Üstbilgileri normal yoldan daha önce göndermenin çok kapsamlı sonuçları olabilir. Şu anda aklıma gelenlerden sadece birkaçı aşağıdadır:

  1. Mevcut PHP sürümlerinde çıktı arabelleğe alma özelliği olsa da, kodunuzu dağıtacağınız gerçek üretim sunucuları herhangi bir geliştirme veya test makinesinden çok daha önemlidir. Ve her zaman en son PHP trendlerini hemen takip etme eğilimi göstermezler.

  2. Açıklanamayan işlevsellik kaybı üzerinde baş ağrınız olabilir . Diyelim ki bir tür ödeme ağ geçidi uyguluyorsunuz ve ödeme işlemcisi tarafından başarılı bir şekilde onaylandıktan sonra kullanıcıyı belirli bir URL'ye yönlendiriyorsunuz. Bir tür PHP hatası, bir uyarı veya aşırı satır bitmesi olursa, ödeme işlenmemiş kalabilir ve kullanıcı yine de faturalandırılmamış gibi görünebilir. Bu aynı zamanda gereksiz yeniden yönlendirmenin kötü olmasının nedenlerinden biridir ve yeniden yönlendirme kullanılacaksa dikkatli kullanılmalıdır.

  3. En son sürümlerde bile Internet Explorer'da "Sayfa yükleme iptal edildi" hata türlerini alabilirsiniz. Bunun nedeni , birkaç gün önce karşılaştığım gibi, bazı PHP dosyalarındaki aşırı satır sonları nedeniyle bir AJAX yanıtı / json içermesi gereken bir şey içermesidir.

  4. Uygulamanızda bazı dosya indirmeleri varsa , bu nedenle de kırılabilirler. Ve bir indirmenin belirli kırılma alışkanlığı sunucuya, tarayıcıya, dosyanın türüne ve içeriğine (ve muhtemelen sizi sıkmak istemediğim diğer faktörlere) bağlı olduğundan, yıllar sonra bile fark etmeyebilirsiniz. .

  5. Son olarak, Symfony , Zend ve Laravel de dahil olmak üzere birçok PHP çerçevesi ( kodlama kılavuzlarında bundan bahsedilmemiştir, ancak uygundur) ve PSR-2 standardı (madde 2.2) kapanış etiketinin atlanmasını gerektirir. PHP manuel kendisi ( 1 , 2 ), Wordpress , Drupal ve sanırım diğer birçok PHP yazılımı bunu tavsiye ederim. Standardı takip etmeyi (ve kodunuz için PHP-CS-Fixer'ı ) alışkanlık haline getirirseniz, sorunu unutabilirsiniz. Aksi takdirde, sorunu daima aklınızda tutmanız gerekir.

Bonus: Bu 2 karakterle ilgili birkaç gotcha (aslında şu anda bir):

  1. Bazı iyi bilinen kütüphaneler bile fazla satır sonları içerebilir ?>. Bir örnek Smarty'dir, hem 2. * hem de 3. * dalının en son sürümlerinde bile vardır. Bu nedenle, her zamanki gibi üçüncü taraf kodunu izleyin . Bonus bonus: Gereksiz PHP sonlarını silmek için bir regex: (\s*\?>\s*)$PHP kodu içeren tüm dosyalarda boş metin ile değiştirin .

Biraz farklı regex Bul ve Değiştir iletişim kutusu için Netbeans \?>(?s:.){0,10}\Z
IDE'li

@Cek, herhangi bir metni yakalar -İçeriği Kodunuzu 10 karakter veya daha az peşinde olduğu ?>: eşleştiği -ve delete- olacağını örneğin ?> Helloiçinde <?php echo "test"; ?> Hello. Yalnızca yakın etiketleri silmek istiyoruz.
Halil Özgür

6
Daha da kötüsü, PHP 5.4 ile apache 2.4.6 aslında kapanış etiketinin arkasında boş alan olduğunda üretim makinelerimizde hataları keser. Sonunda böcek strace ile daraltıncaya kadar sadece saatlerce boşa harcadım. İşte apache atar hatadır: [core:notice] [pid 7842] AH00052: child pid 10218 exit signal Segmentation fault (11).
Artem Russakovskii

3
@ INTPnerd Oh, soru ve cevapların çoğu başlık şey ifade, bu yüzden bu konu okurken herkes bu konuda bir fikir olurdu varsayalım. Altta yatan sorun ve buradaki cevapların çoğundaki sorunların asıl nedeni ?>, sonradan (herhangi bir çıktı gibi) başlıklar çıktı alınmaz gönderilmeye neden olan gereksiz boşluktur . "HTML üstbilgileri" (alakasız HTML5 <header>etiketi dışında) yoktur.
Halil Özgür

2
Genel değiştiriciden bağımsız olarak bunun çalışması gerekir: \ s * \?> \ S * \ Z Sonunda '\ Z' dikkat edin. Bir php kapanış etiketi yalnızca dosyanın sonundaki son boşluk olmayansa yakalamanızı sağlar.
Erutan409

122

Php kapanış etiketi ( ?>) kapalı bırakmanız gerekir nedeni böylece programcı yanlışlıkla ekstra satırsonu grafikler göndermek değildir.

Php kapanış etiketi kapalı olmamalıdır nedeni php etiketlerinde bir dengesizlik neden olur ve yarım zihin ile herhangi bir programcı ekstra beyaz boşluk eklemeyi hatırlıyorum olabilir.

Yani sorunuz için:

Bitiş php etiketini atlamak için başka iyi bir nedeni var mı?

Hayır, biten php etiketlerini atlamak için başka bir iyi neden yok.

Kapanış etiketi ile uğraşmadığınız için bazı argümanlar ile bitireceğim:

  1. İnsanlar ne kadar akıllı olurlarsa olsunlar her zaman hata yapabilirler. Olası hataların sayısını azaltan bir uygulamaya bağlı kalmak (IMHO) iyi bir fikirdir.

  2. PHP XML değildir. PHP'nin iyi yazılmış ve işlevsel olması için XML'lerin katı standartlarına uyması gerekmez. Eksik bir kapanış etiketi sizi rahatsız ediyorsa, bir kapanış etiketi kullanmanıza izin verilir, bu bir şekilde ayarlanmış bir taş kuralı değildir.


2
> yarım zihinli herhangi bir programcı ekstra boşluk bırakmamayı hatırlayabilir. Daha da iyisi, aklı 1/2 olan herhangi bir geliştirici, SVC'ye ön izleme kancası ekleyebilir, böylece herhangi bir arka boşluk otomatik olarak silinir: telaş yok, karışıklık yok.
BryanH

6
@BryanH, sondaki boşlukların kesinlikle gerekli olduğu bir dosya olana kadar, ancak bu çok nadirdir.
zzzzBov

1
Tabii ki haklısın. Bazı harika alternatifler için Mario'nun cevabına göz atın .
BryanH

> "Php kapanış etiketinden ayrılmamanızın nedeni, php etiketlerinde bir dengesizliğe neden olması ve yarım zihinli herhangi bir programcının fazladan boşluk eklememeyi hatırlamasıdır." Windows'da belki. UNIX benzeri sistemlerde, tüm dosyalar \ n ile biter ve programlar sizin için ekler. DÜZENLEME: Aha! @Mario tarafından aşağıda belirtildiği gibi, PHP aslında bunu yiyor.
Andrea

2
Daha da önemlisi, üç kat daha fazla zihne sahip programcıların bile insan olması ve bazı şeyleri unutmasıdır.
Sebastian Mach

57

Bu , iyi niyetli ve kılavuz tarafından tavsiye edilen yeni başlayan bir kodlama stili önerisidir .

  • Bununla ?>birlikte, Eschewing , zaten nedenler (ham çıktı, Malzeme Listesi , bildirimler, vb.) Gönderilmiş ortak başlıkların sadece bir damlama ve takip sorunlarını çözer .

  • PHP aslında ?>kapanış jetonundan sonra tek satırlık satırları yemek için biraz sihir içeriyor . Tarihsel sorunları olsa da, yeni gelenleri hala lapa lapa editörlerine karşı duyarlı ve daha sonra diğer boşluklarda karıştırılmaya bırakıyor ?>.

  • Biçimsel olarak bazı geliştiriciler SGML etiketlerini / XML işleme talimatlarını görüntülemeyi tercih ederler <?phpve ?>bu da izleyen bir yakın tokenin denge tutarlılığını ima eder. (Hangi btw, bağımlılık yapıcı sınıf için yararlıdır , verimsiz dosya dosya otomatik yüklemeyi desteklemeyi içerir.)

  • Biraz nadiren açma <?phpPHPs olarak karakterize edilir mesele (ve başına tam olarak mümkün binfmt_misc böylece karşılık gelen bir yakın etiketin artıklık doğrulayarak,).

  • Klasik PHP sözdizimi kılavuzlarının zorunlu hale ?>\ngetirilmesi ile daha yeni olanlar (PSR-2) arasında ihmal konusunda anlaşılan açık bir tavsiye tutarsızlığı vardır .
    (Kayıt için: Zend Framework, diğerinin üzerinde öne sürmek, kendi içsel üstünlüğünü ima etmez. Uzmanların, hantal API'ların hedef kitlesine çekilmesi / hedeflenmesi konusunda yanlış bir fikirdir).

  • SCM'ler ve modern IDE'ler çoğunlukla yakın etiket bakımını azaltan yerleşik çözümler sunar .

?>Kapat etiketinin herhangi bir şekilde kullanılmasının engellenmesi, nadiren karşılaşılan sorunlardan kaçınmak için temel PHP işleme davranışını ve dil semantiğini açıklamayı geciktirir. Öyle pratik nedeniyle katılımcılar yeterlilik varyasyonlara işbirlikçi yazılım geliştirme için hala.

Etiket varyasyonlarını kapat

  • Düzenli ?> yakın etiketi olarak da bilinir T_CLOSE_TAG, ya da bu nedenle "yakın belirteç".

  • PHP'nin sihirli yeni satır yemeğinden dolayı birkaç enkarnasyondan oluşur :

    ?>\n (Unix satır besleme)

    ?>\r (Satır başı, klasik MAC'ler)

    ?>\r\n (CR / LF, DOS / Win üzerinde)

    PHP, Unicode birleşik satır aralığını NEL(U + 0085) desteklemez.

    İlk PHP sürümlerinde IIRC derleme-ins sınırlayıcı platform-agnostisizm bir şekilde vardı (FI bile >yakın işaretleyici olarak kullanıldı ), bu da yakın etiket kaçınmanın olası tarihi kaynağıdır.

  • Genellikle gözden kaçan, ancak dek PHP7 onları kaldırır , düzenli <?phpaçılış belirteç olabilir validly nadiren kullanılan ile eşleştirilmiş </script>olarak tek kapama belirteci .

  • " Zor kapatma etiketi " bile tek değil - sadece bu terimi benzetmeye hazırladı. __halt_compilerBununla birlikte, kavramsal olarak ve kullanım açısından yakın simge olarak kabul edilmelidir.

    __HALT_COMPILER();
    ?>

    Temelde tokenizer, daha sonra herhangi bir kodu veya düz HTML bölümlerini atar. Özellikle PHAR taslakları, ya ?>da tasvir edildiği gibi gereksiz kombinasyonundan faydalanır .

  • Benzer şekilde, boşlukreturn; dosyalarında herhangi bir ?>boşluk bulunmadığından , içerilen komut dosyalarında bir boşluk nadiren kullanılır .

  • Sonra her türlü yumuşak / sahte yakın etiket varyasyonları vardır; daha az bilinir ve nadiren kullanılır, ancak genellikle yorum yapılan jetonlar başına :

    • // ? >PHP tokenizer tarafından tespit kaçınmak için basit boşluk .

    • Ya da // ﹖﹥normal ifadenin kavrayabileceği süslü Unicode ikameleri (U + FE56 KÜÇÜK SORU İŞARETİ, U + FE65 KÜÇÜK AÇILI BRAKET).

    Her ikisi de PHP için bir anlam ifade etmez , ancak PHP'den habersiz veya yarı farkında harici araç kitleri için pratik kullanımlara sahip olabilir. Yine catbirleştirilmiş komut dosyaları akla gelir ve sonuçta // ? > <?phpeski dosya bölümlemesini satır içinde tutan birleşimler olur.

Dolayısıyla, zorunlu bir yakın etiket ihmaline bağlama bağlı ancak pratik alternatifler vardır.

?>Yakın etiketlerin manuel olarak bebek bakımı her iki şekilde de çağdaş değildir. Bunun için her zaman otomasyon araçları vardır (sadece sed / awk veya regex-oneliners olsa bile). Özellikle:

phptags tag tidier

https://fossil.include-once.org/phptags/

Hangi genellikle --uncloseüçüncü taraf kodu için php etiketleri, ya da sadece herhangi bir (ve tüm) gerçek boşluk / BOM sorunları düzeltmek için kullanılabilir:

  • phptags --warn --whitespace *.php

Ayrıca --longçalışma zamanı / yapılandırma uyumluluğu için etiket dönüştürme vb.


7
Evet, künt VE kışkırtıcı ifadeler aşağı oyları çeker. Zaman içinde okuduğum kadarıyla, bunu kaldıramayacak bir yazılımla çalışmadığınız sürece kapanış jetonunu bırakmanın kesinlikle hiçbir dezavantajı yoktur. Aslında kapanış jetonlarını atlamanın kötü olduğunu ve çok noob bir şey olduğunu kanıtlayamazsanız, benim aşağı oyum kalır;)
jpeltoniemi

2
@Pichan: İzin vereceğim. Ama sanırım burada söylenenleri tam olarak anlamadınız. Eschewing ve kaçınmak iki farklı şeydir. Ve yarı çözülen problemler yılan yağı tavsiyesinin sonucudur.
mario

6
@mario: Yeni başlayan bir kodlama stili önerisi . Katılmıyorum. Zend Framework'ün tamamı yakın etiketleri atlar. Bence bu çok kişisel bir seçim, gerçekten <?
Php'mi

1
HTML ne olacak? O zaman gerekli mi? Örnek için <?php if($var): ?>Hello World<?php endif; ?>??? Özellikle belirtilmediğinden gerçekten merak ediyorum.
WASasquatch

1
@WASasquatch Evet. HTML ve PHP modu arasında geçiş yapıyorsanız, her durumda yakın tokenlere ihtiyacınız olacaktır. (Buradaki orijinal soru ile gerçekten ilgili değil.)
mario

22

Bir etiket değil…

Ama eğer varsa, ondan sonra beyaz boşluk alma riskiyle karşı karşıya kalırsınız.

Daha sonra bunu belgenin üstünde bir dahil olarak kullanırsanız, HTTP üstbilgileri göndermeye çalışmadan önce beyaz boşluk (ör. İçerik) eklemenize izin verebilirsiniz.


10
Bir etiket değilse ne var?
danidacar

Lütfen bir örnek verebilir misiniz? Belki benim php yapılandırma whack, ama ben sorunu yeniden oluşturamıyorum.
danidacar

2
<?php $i = 1; ?> file1.php : sonra file2.php:<?php include 'file1.php'; header('Location: http://www.google.com');?>
Quentin

1
Çıktı tamponlamasının dezavantajları vardır; sunucuda daha fazla bellek kullanır (çıktı alınana kadar tüm çıktıların RAM'de saklanması gerektiğinden; arabelleğe almadan doğrudan gider). Aynı zamanda biraz daha yavaştır. Bunların hiçbiri çoğu durumda sorun olmayacak, ancak yine de tembelim, neden kapanış etiketini bırakmıyorsunuz? phpcsKapatma etiketinin dosyalarımın her birinin kalmasını sağlamak için kullanıyorum ve sonra çıktı arabelleği hakkında endişelenmiyorum :)
El Yobo

1
@ danip: php yapılandırma dosyasında output_buffer bayrağını ayarladıysanız, bu sorunu yeniden oluşturamazsınız.
Jichao

16

Kapatmaya izin vermemek oldukça faydalı ?>.

Dosya PHP (sözdizimi hatası değil) için geçerli kalır ve @David Dorward'ın dediği gibi, boşluktan / kesme satırından (tarayıcıya başlık gönderebilecek herhangi bir şey) kaçınmaya izin verir. ?> .

Örneğin,

<?
    header("Content-type: image/png");
    $img = imagecreatetruecolor ( 10, 10);
    imagepng ( $img);
?>
[space here]
[break line here]

geçerli olmayacak.

Fakat

<?
    header("Content-type: image/png");
    $img = imagecreatetruecolor ( 10, 10 );
    imagepng ( $img );

niyet.

Bir kez olsun, güvenli olmak için tembel olmalısın .


3
Bu yüzden italik yazıyı güvenli bir yere koydum. Sonra istenmeyen bir alan için size çok zaman mal olabilir hataları önler ?>. güvenli burada iyi bir kelime olmayabilir. Neyse, değil düzeltmek şey (bir şeyleri önlemek için bana kötü kod değil, bir echoburada kötü kod olurdu) ama / ve hâlâ geçerli olduğundan. Bu konuda bana yanlış olduğunu kanıtla.
Shikiryu

Seni küçümsemedim, btw. Ama benim açımdan sizinkilerle uyumlu. Hiçbir şey düzeltmez. Hiç geçerli olmadığını söylemedim, bu yüzden hiçbir şey kanıtlamama gerek yok.
Christian

1
Chouchenos, eminim güvenli olmak yerine güvenli demek istediniz. IMHO bunun için bir neg çok fazlaydı. Seni bir kareye geri götürdüm. ;-) Sonuçta yanlış bir şey söylemiyordun. PHP geliştirme yönergeleri bile bunu yapmanızı teşvik eder. Aslında, çıktı tamponlama yerine kapatma etiketi eksikliğine güvenmek çok daha iyidir. İkincisi display_errors ayarını kapalı yapmak gibidir. Saf Hile. Uygulamanızın taşınabilir olmaması için iyi bir şans. Gerçekten, kural olarak, çıktı arabelleğe güvenmemenin daha iyi olduğunu düşünüyorum.
maraspin

1
Ben ?>sadece bir php dosyasının sonuna koyarak gibi insanları sorgulamak istemiyorum . ama daha sonra boşlukların neden olduğu bazı hataların hatalarını ayıklama gereği duydunuz mu? Ayrıca, özellikle başka bir ana bilgisayara taşındığınızda tüm sunucular aynı şekilde yapılandırılmaz, hataların yakalanması çok zaman alıcıdır. ?>Sadece koymak istiyorsanız , ayrıca bir sondaki boşluk eklerseniz ve ekibiniz git
suçlamalarına

16

Dokümanlara göre , aşağıdaki nedenden dolayı dosyanın sonundaysa kapanış etiketini atlamak tercih edilir:

Bir dosya saf PHP koduysa, dosyanın sonunda PHP kapanış etiketini atlamak tercih edilir. Bu, PHP kapatma etiketinden sonra yanlışlıkla boşluk veya yeni satırların eklenmesini önler; bu durum, programcıdan komut dosyasında herhangi bir çıktı gönderme niyeti olmadığında PHP çıktı arabelleğe almaya başlayacağından istenmeyen etkilere neden olabilir.

PHP Manual> Dil Referansı> Temel sözdizimi> PHP etiketleri


10

Nedeni biliyorum, ama gösteremem:

Yalnızca PHP kodu içeren dosyalar için closing etiketine ( ?>) hiçbir zaman izin verilmez. PHP için gerekli değildir ve atlanması, izleyen beyaz boşluğun yanlışlıkla yanıta enjeksiyonunu önler.

Kaynak: http://framework.zend.com/manual/en/coding-standard.php-file-formatting.html


23
Bu etikete "asla izin verilmiyor", muhtemelen bir Zend kodlama standardıdır, ancak PHP dosya biçimlendirmesi için bir sözdizimi kuralı değildir.
Matt Huggins

9

Buna bakmanın iki yolu var.

  1. PHP kodu, bir dizi XML işleme talimatından başka bir şey değildir ve bu nedenle .phpuzantıya sahip herhangi bir dosya, PHP kodu için ayrıştırılacak olan bir XML dosyasından başka bir şey değildir.
  2. PHP, açık ve kapalı etiketleri için XML işleme talimatı formatını paylaşır. Buna dayanarak, .phpuzantıları olan dosyalar geçerli XML dosyaları olabilir, ancak olmaları gerekmez.

İlk rotaya inanıyorsanız, tüm PHP dosyaları bitiş etiketlerini kapatmayı gerektirir. Bunları atlamak için geçersiz bir XML dosyası oluşturulur. Sonra tekrar, bir açılış <?xml version="1.0" charset="latin-1" ?>beyanı olmadan , zaten geçerli bir XML dosyanız olmayacak ... Yani büyük bir sorun değil ...

İkinci rotaya inanıyorsanız, bu iki tür .phpdosya için kapıyı açar :

  • Yalnızca kod içeren dosyalar (örneğin kütüphane dosyaları)
  • Yerel XML ve ayrıca kod içeren dosyalar (örneğin şablon dosyaları)

Buna dayanarak, salt kod dosyaları kapanış ?>etiketi olmadan sona erdirilebilir. Ancak XML kodu dosyalarını ?>XML geçersiz kılacağından, kapanmadan bitirmesi uygun değildir .

Ama ne düşündüğünü biliyorum. Bunun ne anlama geldiğini düşünüyorsunuz, asla doğrudan bir PHP dosyası oluşturmayacaksınız, bu yüzden geçerli XML olup olmadığını kimin umurunda. Bir şablon tasarlıyorsanız önemli. Geçerli XML / HTML ise, normal bir tarayıcı sadece PHP kodunu görüntülemez (bir yorum gibi davranılır). Böylece içinde PHP kodu çalıştırmak gerek kalmadan şablonu alay edebilirsiniz ...

Bunun önemli olduğunu söylemiyorum. Bu sadece çok sık ifade edilmediğim bir görüş, bu yüzden paylaşmak için daha iyi bir yer ...

Şahsen, kütüphane dosyalarındaki etiketleri kapatmıyorum, ancak şablon dosyalarında yapıyorum ... Zor bir şeyden ziyade kişisel bir tercih (ve kodlama kılavuzu) ...


1
Bu tamamen yanlış. PHP bu etiketleri XML biçimine çevirmez ve bu nedenle herhangi bir dengesizlik oluşmaz.
Drachenkatze

7
@Felicitus: Sana diyor kısmını cevapsız tahmin "Bunun önemli olduğunu söylemiyorum O yüzden daha iyi ne yer paylaşmaya, çok sık dile göremediğiniz bu sadece bile görünüyor ..." Bu PHP ilgili değil etiketlerin XML'e çevrilmesi. Bir dosya bir XML bağlamında yorumlandığında (HTML veya editörler, vb.) Ne olduğu hakkındadır ... Ama nokta kaçırıldı ...
ircmaxell

7

Zaten söylenen her şeye ek olarak, hata ayıklamamız için büyük bir acı olan başka bir neden atacağım.

PHP 5.4 ile Apache 2.4.6 aslında kapanış phpetiketinin arkasında boş alan olduğunda üretim makinelerimizde segmentasyon hataları . Sonunda böcek strace ile daraltıncaya kadar sadece saatlerce boşa harcadım .

Apache'nin attığı hata:

[core:notice] [pid 7842] AH00052: child pid 10218 exit signal Segmentation fault (11)

6

"Bitiş php etiketini atlamak için başka bir iyi neden (başlık sorunu dışında) var mı?"

İkili çıktı, CSV verileri veya diğer HTML olmayan çıktılar oluştururken yanlışlıkla gereksiz beyaz boşluk karakterlerini çıktılamak istemezsiniz .


1
XML ayrıştırıcı başlangıçta fazladan boş bir satır olduğunda çıktımızı reddettiği için bir müşteri şikayet ettim. Daha da kötüsü, önceden tanımlanmamış bir yapılandırma dosyasındaki kapanış etiketinden sonra yalnızca yedi sunucudan birinde fazladan bir satır ile gerçekleşiyordu.
eswald

5

Artıları

Eksileri

Sonuç

Etiketi atlamak lehine argümanların daha güçlü görüneceğini söyleyebilirim ( header () + ile PHP / Zend "öneri" ile büyük baş ağrısından kaçınmaya yardımcı olur ). Bunun sözdizimi tutarlılığı açısından gördüğüm en "güzel" çözüm olmadığını itiraf ediyorum, ama daha iyi ne olabilir?


2

Sorum bu birinin yinelenen olarak işaretlenmiş olarak, nedenini 's Tamam göndermek için düşünmek DEĞİL kapanış etiketi atlayarak ?>istenen bazı nedenlerden dolayı olabilir.

  • Tam İşleme Talimatları ile Syntax ( <?php ... ?>) PHP kaynağı, SGML ayrıştırıcısı ile sorunsuz bir şekilde ayrıştırılabilen ve işlenebilen geçerli bir SGML belgesidir. Ek kısıtlamalar ile geçerli XML / XHTML de olabilir.

Hiçbir şey geçerli XML / HTML / SGML kodu yazmanızı engellemez. PHP belgeleri bunun farkındadır. Alıntı:

Not: PHP'yi XML veya XHTML içine gömüyorsanız, standartlarla uyumlu kalmak için <? Php?> Etiketlerini kullanmanız gerektiğini unutmayın.

Elbette PHP sözdizimi katı SGML / XML / HTML değildir ve tıpkı HTML'yi XML uyumlu olması için XHTML'ye dönüştürebileceğiniz gibi SGML / XML / HTML olmayan bir belge oluşturursunuz.

  • Bir noktada kaynakları birleştirmek isteyebilirsiniz. Bu, cat source1.php source2.phpkapanmayı atlayarak getirilen tutarsızlıklarınız varsa yapmak kadar kolay olmayacaktır.?> etiketlerini .

  • ?>Belgenin PHP kaçış modunda mı yoksa PHP yoksayma modunda mı kaldığını söylemek daha zor olmadan (PI etiketi <?phpaçılmış veya açılmamış olabilir). Belgelerinizi PHP yoksayma modunda sürekli olarak bırakırsanız hayat daha kolay olur. Tıpkı kapatılmamış, kötü yerleştirilmiş etiketlere sahip belgelere kıyasla iyi biçimlendirilmiş HTML dokümanlarıyla çalışmak gibidir.

  • Dreamweaver gibi bazı editörlerin PI açık bırakılmış sorunları olabilir [1] .


0

Soruyu doğru anlarsam, çıktı arabelleğe alma ve bunun etiketlerin kapanması / bitmesi üzerindeki etkisi ile ilgilidir. Bunun tamamen geçerli bir soru olduğundan emin değilim. Sorun, çıkış arabelleğinin istemciye göndermeden önce tüm içeriğin bellekte tutulduğu anlamına gelmemesidir. Bu, içeriğin bir kısmının olduğu anlamına gelir.

Programcı, tamponu veya çıktı tamponunu kasıtlı olarak temizleyebilir, böylece PHP'deki çıktı tamponu seçeneği kapanış etiketinin kodlamayı nasıl etkilediğini gerçekten değiştirir mi? Ben öyle olmadığını iddia ediyorum.

Ve belki de bu yüzden cevapların çoğu kişisel stil ve sözdizimine geri döndü.


0

Php kodunun 2 olası kullanımı vardır:

  1. Sınıf tanımı veya işlev tanımı gibi PHP kodu
  2. PHP'yi şablon dili olarak kullanma (ör. Görünümlerde)

durumda 1. kapanış etiketi tamamen unusefull, ben de böyle bir durumda sadece 1 (bir) php açık etiketi ve NO (sıfır) kapanış etiketi görmek istiyorum. Bu, kodu temiz ve mantığı sunumdan ayırdığı için iyi bir uygulamadır. Sunum durumu (2.) için bazıları, tüm etiketlerin (PHP tarafından işlenmiş olanlar bile) kapatılmasının doğal olduğunu bulmuştur, bu da PHP'nin aslında karıştırılmaması gereken 2 ayrı kullanım durumuna sahip olduğu için güvene yol açmaktadır: mantık / hesap ve sunum

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.