web-dev-qa-db-ja.com

PHP <<< EOF文字列内でGettextを使用

PHP EOF文字列を使用して、引用符などをエスケープする手間をかけずにHTMLコンテンツをフォーマットします。この文字列内で関数を使用するにはどうすればよいですか?

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

マニュアル でわかる限り、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();

その後、次の構文を使用して、HEREDOCブロック内でgettextルックアップを実行できます。

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

$translate->Worldは、マジックゲッターメソッドのおかげで自動的にgettextルックアップに変換されます。

スペースまたは特殊文字(たとえば、Hello World!!!!!!という名前のgettextエントリ)でこのメソッドを使用するには、次の表記法を使用する必要があります。

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

これはすべてテストされていませんが、動作するはずです。

Update:@marioが見つけたように、結局HEREDOC文字列から関数を呼び出すことが可能です。このようなゲッターを使用するのは洗練されたソリューションだと思いますが、直接関数呼び出しを使用する方が簡単かもしれません。これを行う方法に関するコメントを参照してください。

87
Pekka 웃

私が見る限り、あなたは誤ってヒアドキュメントを追加したばかりです
ここではいヒアドキュメント構文を使用する必要はありません。
削除するだけですべてが機能します。

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