web-dev-qa-db-fra.com

PHP utilisant Gettext dans <<< chaîne EOF

J'utilise PHP EOF chaîne pour formater le contenu HTML sans avoir à échapper aux guillemets, etc.). Comment puis-je utiliser la fonction dans cette chaîne?

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

Autant que je puisse le voir dans le manuel , il n'est pas possible d'appeler des fonctions dans les chaînes HEREDOC. Une façon fastidieuse serait de préparer les mots à l’avance:

<?php

    $world = _("World");

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

une idée de solution de rechange qui me vient à l’esprit est de construire une classe avec un méthode d’acquisition magique .

Vous déclareriez une classe comme celle-ci:

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

Initialiser un objet de la classe à un moment donné:

  $translate = new Translator();

Vous pouvez ensuite utiliser la syntaxe suivante pour effectuer une recherche gettext dans un bloc HEREDOC:

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

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

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

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

Ceci est tout non testé mais devrait fonctionner.

Mise à jour : Comme @mario l'a découvert, il est possible d'appeler des fonctions à partir de chaînes HEREDOC. Je pense que l'utilisation de getters comme celui-ci est une solution élégante, mais l'utilisation d'un appel de fonction direct peut être plus facile. Voir les commentaires sur la façon de procéder.

87
Pekka 웃

Autant que je sache, vous avez simplement ajouté heredoc par erreur
Inutile d'utiliser la syntaxe laide heredoc ici.
Retirez-le et tout fonctionnera:

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