2010-09-12 88 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

相关问题