2010-09-12 32 views
41

PHP'nin EOF dizesini tırnak içeriğinden kaçmak zorunda kalmadan, HTML içeriğini biçimlendirmek için kullanıyorum. Bu işlevi bu dizede nasıl kullanabilirim?İçinde Gettext kullanarak PHP <<< EOF dizgisi

<?php 
    $str = <<<EOF 
    <p>Hello</p> 
    <p><?= _("World"); ?></p> 
EOF; 
    echo $str; 
?> 

cevap

72

Bildiğim kadarıyla the manual görebileceğiniz gibi, heredoc dizge içinde işlevleri çağırmak mümkün değildir. Bir hantal yolu önceden kelimeleri hazırlamak olacaktır:

<?php 

    $world = _("World"); 

    $str = <<<EOF 
    <p>Hello</p> 
    <p>$world</p> 
EOF; 
    echo $str; 
?> 

zihin magic getter method bir sınıf inşa ediyor gelir geçici bir çözüm fikri.

Böyle bir sınıf bildirmek istiyoruz:

class Translator 
{ 
public function __get($name) { 
    return _($name); // Does the gettext lookup 
    } 
} 

noktada sınıfının bir nesnesini başlatın:

$translate = new Translator(); 

Daha sonra içinde bir gettext arama yapmak için aşağıdaki sözdizimini kullanabilirsiniz heredoc bloğu:

$str = <<<EOF 
    <p>Hello</p> 
    <p>{$translate->World}</p> 
EOF; 
    echo $str; 
?> 

$translate->World otomatik tra olacak Sihirli alıcı yöntemi sayesinde gettext aramaya eklendi.

boşluk veya özel karakterler ile kelimeleri Bu yöntemi kullanmak için (örneğin Hello World!!!!!! adında bir gettext girişi, aşağıdaki gösterim kullanmak zorunda olacak.

$translate->{"Hello World!!!!!!"} 

Bu, tüm denenmemiş ama çalışması gerekir

Güncelleştirme: As @mario öğesinin, her şeyden sonra HEREDOC dizelerinden işlev çağırmak olduğunu öğrendim.Bu gibi alıcılar kullanmak, şık bir çözüm olduğunu düşünüyorum, ancak doğrudan işlev çağrısı kullanmak daha kolay olabilir. nasıl Bunu yap.

+1

. Test edilmedi, bu yüzden size tam bir garanti veremem ama görebildiğim kadarıyla, bu işe yarayacak. Daha karmaşık gettext tanımlayıcılarıyla nasıl başa çıkılacağına dair son güncellememe (boşluklar ve özel karakterler ile ilgili olarak) bakın. –

+0

Wow, alıcıların oldukça zor/şematik kullanımı. – mario

+7

İşlev çağrılarını kullanabileceğinizden çıkıyor. $ _ = "_"; 'Ve' {$ _ ('text')} 'ile. Ancak getter sözdizimi +1'dir. – mario

0

Bildiğim kadarıyla gördüğünüz gibi, sadece yanlışlıkla
burada çirkin Yorumlu metin sözdizimi kullanmak gerek yok tarafından yorumlu metin ekledi.
Sadece kaldırmak ve her şeyi çalışır: rica ederim @FFish

<p>Hello</p> 
<p><?= _("World"); ?></p> 
+3

"Merhaba Dünya" nın OP'nin gerçek üretim kodundan bir alıntı olduğunu düşünmüyorum. –

+0

@Pekka farketmez. Heredoc, –

+3

boyutunda hala işe yaramıyor Bana göre, Heredoc'un bir çeşit şablon motoru kullanmanın iyi bir alternatifi olduğu bazı durumlar var.Benim düşünceme göre tek büyük dezavantajı, son belirtecin girintilendirilememesidir, bu da girintili kod sınıflarını mahvetme eğilimindedir. –