2010-09-12 36 views
41

Utilizo la cadena EOF de PHP para formatear contenido HTML sin la molestia de tener que escapar de las citas, etc. ¿Cómo puedo usar la función dentro de esta cadena?PHP usando Gettext dentro de <<< string EOF

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

Respuesta

72

Por lo que yo puedo ver en the manual, no es posible llamar a funciones dentro de las cadenas heredoc. Una forma sería engorroso para preparar de antemano las palabras:

<?php 

    $world = _("World"); 

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

una idea solución que viene a la mente es la construcción de una clase con un magic getter method.

Se podría declarar una clase como esta:

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

inicializar un objeto de la clase en algún momento:

$translate = new Translator(); 

A continuación, puede utilizar la siguiente sintaxis para realizar una búsqueda gettext dentro de una bloque heredoc:

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

$translate->World será automáticamente tra nslated a la búsqueda de gettext gracias al método magic getter.

Para utilizar este método para las palabras con espacios o caracteres especiales (por ejemplo, una entrada gettext llamado Hello World!!!!!!, que tendrá que utilizar la siguiente notación:.

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

Esto es todo lo no probado, pero debería funcionar

Actualización: Como @mario averiguó, es posible llamar funciones de cadenas HEREDOC después de todo. Creo que usar getters como esta es una solución elegante, pero usar una llamada de función directa puede ser más fácil. Vea los comentarios en cómo hacer esto.

+1

@FFish de nada. No está probado, así que no puedo darte una garantía total, pero hasta donde puedo ver, esto funcionará. Vea mi última actualización (con respecto a espacios y caracteres especiales) sobre cómo tratar con identificadores de texto gettext más complejos –

+0

Wow, uso bastante complicado/intrigante de getters. – mario

+7

Resulta que puede usar llamadas a funciones. Con '$ _ =" _ ";' y '{$ _ ('text')}'. Pero la sintaxis getter es +1. – mario

0

Por lo que yo puedo ver, que acaba de añadir heredoc por error
No hay necesidad de utilizar la sintaxis heredoc fea aquí.
Basta con retirar y todo funcionará:

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

No creo que "Hello World" sea un extracto del código de producción real del OP. –

+0

@Pekka no importa. Heredoc sigue siendo inútil, sin importar el tamaño –

+3

Para mí, hay una serie de situaciones donde el uso de Heredoc es una buena alternativa al uso de un motor de plantillas de algún tipo.La única gran desventaja en mi opinión es que el marcador final no puede sangrarse, lo que tiende a estropear las clases de código sangradas –