PHP с использованием Gettext внутри << - PullRequest
46 голосов
/ 12 сентября 2010

Я использую строку EOF PHP для форматирования содержимого HTML без необходимости экранирования кавычек и т. Д. Как я могу использовать функцию внутри этой строки?

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

Ответы [ 2 ]

87 голосов
/ 12 сентября 2010

Насколько я вижу в руководстве , невозможно вызывать функции внутри строк 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();

Затем вы можете использовать следующий синтаксис для поиска gettext внутри блока HEREDOC:

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

$translate->World будет автоматически переведен в поиск gettext благодаря волшебному методу getter.

Чтобы использовать этот метод для слов с пробелами или специальных символов (например, запись gettext с именем Hello World!!!!!!, вам необходимо использовать следующую запись:

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

Это все не проверено, но должно работать.

Обновление : Как выяснил @mario, все-таки можно вызывать функции из строк HEREDOC. Я думаю, что использование геттеров, таких как это, является гладким решением, но использование прямого вызова функции может быть проще. Смотрите комментарии о том, как это сделать.

0 голосов
/ 12 сентября 2010

Насколько я вижу, вы только что добавили heredoc по ошибке
Нет необходимости использовать здесь уродливый синтаксис heredoc.
Просто удалите его, и все будет работать:

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