60 votes

PHP en utilisant Gettext à l'intérieur <<

I utilisation de PHP EOF chaîne de format contenu HTML sans les tracas d'avoir à échapper les guillemets etc. Comment puis-je utiliser la fonction à l'intérieur de cette chaîne?

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

106voto

Pekka 웃 Points 249607

Aussi loin que je peux voir dans le manuel, il n'est pas possible d'appeler des fonctions à l'intérieur de HEREDOC cordes. Un lourd moyen serait de préparer les mots à l'avance:

<?php

    $world = _("World");

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

une solution de contournement idée qui vient à l'esprit est la construction d'une classe avec une magie de la méthode de lecture.

Vous pouvez déclarer une classe comme ceci:

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

Initialiser un objet de la classe à un certain point:

  $translate = new Translator();

Vous pouvez ensuite utiliser la syntaxe suivante pour faire un gettext de recherche à l'intérieur d'un HEREDOC bloc:

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

$translate->World sera automatiquement traduit de l'gettext de recherche grâce à la magie de la méthode de lecture.

Pour utiliser cette méthode pour les mots par des espaces ou des caractères spéciaux (par exemple, un gettext entrée nommée Hello World!!!!!!, vous devrez utiliser la notation suivante:

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

C'est tout non testé mais devrait fonctionner.

Mise à jour: Comme @mario trouvé, il est possible d'appeler des fonctions de HEREDOC chaînes après tout. Je pense à l'aide de méthodes comme c'est une solution élégante, mais l'aide directe d'un appel de fonction peut être plus facile. Voir les commentaires sur la façon de le faire.

-2voto

Aussi loin que je peux voir, vous venez d'ajouter heredoc par erreur
Pas besoin d'utiliser laid syntaxe heredoc ici.
Il suffit de retirer et tout fonctionnera:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X