Heredoc çok satırlı bir stringdir. <<<EOT ile başlatın, metni sonraki satırlara yazın ve kendi satırında EOT; ile bitirin. İçindeki değişkenler çift tırnaklı bir stringdeki gibi değiştirilir.
Tanımlayıcı (burada EOT) bir harf veya alt çizgi ve ardından gelen harfler, rakamlar veya alt çizgilerden oluşur. İnsanlar metnin ne olduğunu söyleyen adlar seçer: HTML, SQL, TEXT. Aralarında PhpStorm'un da bulunduğu bazı editörler, ad HTML veya SQL olduğunda gövdeyi o dilde renklendirir.
Heredoc ile HTML şablonu oluşturmak
Heredoc, içinde değerler olan bir HTML bloğu yazmanın en açık yoludur, çünkü işaretleme şeklini korur ve hiçbir şeyin kaçırılması gerekmez. Çıktı HTML olduğu için editör onu Page sekmesinde gösterir.
O bloktaki iki ayrıntı: dizi elemanı süslü parantez içine alınmıştır, {$product['name']}, ve fiyattan önceki gerçek dolar işareti \$ olarak kaçırılmıştır. Adı değiştirin ya da bir etiket ekleyip tekrar çalıştırın.
Kullanıcılardan gelen değerler HTML'e girmeden önce kaçırılmalıdır. Nedenini ve nasıl yapılacağını htmlspecialchars sayfasında görün.
Nowdoc: interpolasyonsuz metin
Nowdoc tanımlayıcıyı tek tırnak içine koyar: <<<'EOT'. İçindeki hiçbir şey değiştirilmez, bu yüzden dolar işaretleri ve ters eğik çizgiler yazıldığı gibi kalır. Kod örnekleri, düzenli ifadeler ve $ içeren her metin için kullanın.
Kapanış işaretini girintilemek
PHP 7.3'ten beri kapanış işareti girintili olabilir ve bu girinti gövdenin her satırından kaldırılır. Bu sayede bir fonksiyonun veya bir if bloğunun içindeki heredoc, boşluklar stringe girmeden kodun girintisini takip edebilir.
json_encode satırı sonucu karakter karakter görünür kılar: her satırdan 8 boşluk kaldırıldı, çünkü kapanıştaki TEXT; 8 boşlukla girintilidir.
Kapanış işaretinden daha az girintili bir gövde satırı ayrıştırma hatasıdır:
$html = <<<HTML
<p>Hello</p>
HTML;
PHP Parse error: Invalid body indentation level (expecting an indentation level of at least 4) in /home/index.php on line 3
Heredoc içinde diziler, nesneler ve metot çağrıları
Heredoc çift tırnakla aynı kuralları izler. Basit değişkenler tek başına çalışır; tırnaklı dizi anahtarları, iç içe diziler, özellikler ve metot çağrıları için süslü parantez kullanın.
Fonksiyon argümanı olarak heredoc
PHP 7.3'ten beri kapanış işaretinin ardından aynı satırda başka kod gelebilir, bu yüzden bir heredoc doğrudan bir fonksiyona geçirilebilir ya da bir diziye konabilir. sprintf ile yer tutucuları sonradan doldurulan bir şablon elde edersiniz.
Sık yapılan hata: eksik noktalı virgül veya işaretten sonra fazladan metin
Kapanış tanımlayıcısı tam açıldığı gibi (aynı büyük/küçük harfle) yazılmalıdır ve o satırda ardından gelen her şey PHP olarak anlamlı olmalıdır. EOT; bir ifadeyi bitirir, EOT, bir argüman listesini sürdürür. İşaretten hemen sonra gelen bir harf veya rakam (EOTX;) onu gizler; bu yüzden string dosyanın sonuna kadar devam eder ve PHP syntax error, unexpected end of file bildirir. Ters tuzak, tanımlayıcıyla başlayıp ardından bir boşluk veya noktalama işareti gelen bir gövde satırıdır, örneğin EOT is the marker: stringi erken bitirir ve o satırın geri kalanı PHP olarak okunur (syntax error, unexpected identifier "is"). Metinde hiçbir satırın başında geçmeyen bir tanımlayıcı seçin; örneğin işaretleme için HTML, bir sorgu için SQL.
Sıkça Sorulan Sorular
PHP'de heredoc nedir?
Tırnak kullanmadan çok satırlı bir string yazmanın yoludur: <<<EOT ve bir yeni satırla başlayın, metni yazın ve kendi satırında EOT; ile bitirin. İçindeki değişkenler tıpkı çift tırnaklı bir stringdeki gibi değiştirilir ve " ile ' karakterlerini serbestçe kullanabilirsiniz.
Heredoc ile nowdoc arasındaki fark nedir?
Heredoc (<<<EOT) değişkenleri ve kaçış dizilerini çift tırnaklı bir string gibi değiştirir. Nowdoc (<<<'EOT', tanımlayıcı tek tırnak içinde) ikisini de yapmaz ve her $ ile ters eğik çizgiyi, tek tırnaklı bir string gibi, yazıldığı gibi tutar.
Heredoc'un kapanış işareti girintili olabilir mi?
Evet, PHP 7.3'ten beri. Kapanış işaretinin girintisi gövdenin her satırından kaldırılır, böylece bir heredoc'u kodunuza uyacak şekilde girintileyebilirsiniz. Gövdenin her satırı en az kapanış işareti kadar girintili olmalıdır, aksi hâlde PHP bir ayrıştırma hatasıyla durur.
Heredoc içinde bir fonksiyonu nasıl çağırırım?
Heredoc yalnızca değişkenleri, dizi elemanlarını, özellikleri ve metot çağrılarını yerleştirir. Fonksiyonu önce çağırıp sonucu saklayın ya da fonksiyon adını veya bir closure'ı bir değişkende tutup süslü parantez içinde çağırın: $e = 'htmlspecialchars'; ardından {$e($text)}.