2010-09-12 63 views
41

我使用PHP的EOF字符串來格式化HTML內容,而沒有必須逃避引號等麻煩。我如何使用該字符串中的函數?PHP內使用Gettext <<< EOF字符串

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

回答

72

至於我可以看到the manual,這是不可能調用HEREDOC字符串函數內。麻煩的辦法是事先準備的話:

<?php 

    $world = _("World"); 

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

想到的是建立一個類與magic getter method解決方法的想法。

你會聲明一個類是這樣的:

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

在某些時候初始化類的一個對象:

$translate = new Translator(); 

然後可以使用下面的語法裏面做一個一個的gettext查找HEREDOC塊:

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

$translate->World將自動被tra由於使用了神奇的getter方法,所以轉換爲gettext查找。

要使用此方法用空格或特殊字符的話(例如名爲Hello World!!!!!!一個gettext的入口,你將不得不使用下面的符號:

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

這是所有未經測試,但應該工作

更新:作爲@mario發現,畢竟有可能從HEREDOC字符串中調用函數,我認爲使用這樣的getter是一個圓滑的解決方案,但使用直接函數調用可能更容易。如何 做這個。

+1

@FFish歡迎您。它沒有經過測試,所以我不能給你一個完全的保證,但據我所知,這將起作用。查看我的最新更新(關於空格和特殊字符),瞭解如何處理更復雜的gettext標識符 – 2010-09-12 09:37:49

+0

哇,非常棘手/計劃使用getter。 – mario 2010-09-12 09:46:04

+7

原來你可以使用函數調用。用'$ _ =「_」;'和'{$ _('text')}'。但getter語法是+1。 – mario 2010-09-12 09:53:22

0

據我所看到的,你只是被錯誤
沒有必要在這裏使用難看定界符添加定界符。
只是將其刪除,一切都將工作:

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

我不認爲「Hello World」是OP實際生產代碼的摘錄。 – 2010-09-12 13:24:39

+0

@皮卡它沒關係。無論大小如何,Heredoc仍然無用 – 2010-09-12 13:29:11

+3

對我而言,有很多情況下使用Heredoc是使用某種模板引擎的一個很好的選擇。在我看來,唯一的一大缺點就是結束標記不能縮進,這往往會導致縮進的代碼類別 – 2010-09-12 13:31:47

相關問題