PHP 在 <<<EOF 字符串中使用 Gettext

PHP using Gettext inside <<<EOF string

提问人:FFish 提问时间:9/12/2010 最后编辑:A.LFFish 更新时间:10/22/2020 访问量:221381

问:

我使用 PHP 的 EOF 字符串来格式化 HTML 内容,而不必转义引号等。如何使用此字符串中的函数?

<?php
    $str = <<<EOF
    <p>Hello</p>
    <p><?= _("World"); ?></p>
EOF;
    echo $str;
?>
php 获取文本 eof

评论


答:

104赞 Pekka 9/12/2010 #1

据我在手册中看到,无法调用 HEREDOC 字符串中的函数。一个繁琐的方法是事先准备好单词:

<?php

    $world = _("World");

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

我想到的一个解决方法是使用 Magic Getter 方法构建一个类。

你可以声明一个这样的类:

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

在某个时候初始化类的对象:

  $translate = new Translator();

然后,您可以使用以下语法在 HEREDOC 块中执行 gettext 查找:

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

$translate->World由于 Magic Getter 方法,将自动转换为 gettext 查找。

要将此方法用于带有空格或特殊字符的单词(例如,名为 的 gettext 条目,您必须使用以下表示法:Hello World!!!!!!

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

这一切都未经测试,但应该有效。

更新:正如@mario发现的那样,毕竟可以从 HEREDOC 字符串调用函数。我认为使用这样的 getter 是一个时尚的解决方案,但使用直接函数调用可能更容易。请参阅有关如何执行此操作的评论。

评论

1赞 Pekka 9/12/2010
@FFish不客气。它未经测试,所以我不能给你一个完全的保证,但据我所知,这将起作用。请参阅我的最新更新(关于空格和特殊字符),了解如何处理更复杂的 gettext 标识符
8赞 mario 9/12/2010
原来你可以使用函数调用。使用 和 。但是 getter 语法是 +1。$_="_";{$_('text')}
0赞 Pekka 9/12/2010
@mario哦,哇,不知道!这值得国际海事组织单独回答。
3赞 FFish 9/14/2010
感谢您的回复马里奥。这是缺少的内容: $_ = “gettext”;分配函数引用以供 HEREDOC 使用。Than {$_(“World”)} 在 HEREDOC 字符串中工作!
0赞 MAHA OUEGHLANI 6/5/2023
@Pekka 我可以使用iside吗?foreach<<<EOF
-2赞 Your Common Sense 9/12/2010 #2

据我所知,您只是错误地添加了heredoc,
无需在此处使用丑陋的heredoc语法。
只需删除它,一切正常:

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

评论

6赞 Pekka 9/12/2010
我不认为“Hello World”是 OP 实际生产代码的摘录。
0赞 Your Common Sense 9/12/2010
@Pekka没关系。无论大小,Heredoc 仍然没用
3赞 Pekka 9/12/2010
对我来说,在许多情况下,使用 Heredoc 是使用某种模板引擎的一个很好的替代方案。在我看来,它唯一的大缺点是结束标记不能缩进,这往往会搞砸缩进的代码类
1赞 Pekka 9/12/2010
@Col 我完全同意,但 OP 提供的代码只是解释问题的示例,不是吗?
3赞 OsakaWebbie 5/3/2019
晚了好几年,但我会指出一种情况,即不能简单地删除 heredoc:当您想将标记分配给变量并对其进行其他操作时,而不是立即输出它。这就是我的处境,也是我来到这里的原因。