2011-03-09 17 views
5

Estoy tratando de averiguar cómo usar una variable definida al usar <<<HTML en php. Este es un ejemplo de lo que quiero lograr:Accediendo a la variable definida dentro de <<< HTML en php

<?php 
define('TEST','This is a test'); 
echo <<<HTML 
Defined: {TEST} 
HTML; 
?> 

Cuál es la manera adecuada de conseguir el "TEST" se define dentro de la <<<HTML?

Edit:
Hice una pequeña prueba para verificar cuál de los métodos es el más rápido. Para mi prueba, utilicé 20 variables dentro de heredoc. Esto es lo que sucedió con los diferentes métodos (en segundos):
Accessing defined variable inside <<<HTML in php parece ser la forma más lenta de hacerlo - 0.00216103.
Accessing defined variable inside <<<HTML in php es más rápido - 0.00073290.
Accessing defined variable inside <<<HTML in php es aún más rápido - 0.00052595.
Accessing defined variable inside <<<HTML in php es el más rápido - 0.00011110.

Espero que esto ayude a alguien más :)

Respuesta

10

No es bonito me temo, pero ...

define('TEST','This is a test'); 

var $defined = TEST; 

echo <<<HTML 
Defined: {$defined} 
HTML; 

No hay, por lo que yo soy consciente, al menos, una Para usar valores definidos directamente en ese contexto, debe usar una variable.

+0

Eso es lo que yo también pensé. Solo tenía curiosidad si hay otra manera. – tftd

+2

obtiene el voto, simplemente porque es correcto. La sintaxis de heredoc solo puede evaluar variables. Tendría que asignar una constante a una variable para insertarla en su cadena. ¿Tal vez mirar una técnica alternativa de construcción de cuerdas? –

+0

Utilizo variables normales en lugar de las definidas. Me preguntaba si las cosas se han evaluado mejor en php, pero aparentemente tendré que usar las variables durante mucho tiempo :) – tftd

3

No puede. Asigna su valor a una variable real.

5

Aquí es un método que encontré en las notas en el manual de php: http://www.php.net/manual/en/function.define.php#100449

Es un poco complicado, pero debería funcionar.

<?php 
define('TEST','This is a test'); 

$cst = 'cst'; 
function cst($constant){ 
    return $constant; 
} 

echo <<<HTML 
Defined: {$cst(TEST)} 
HTML; 

Si tiene varios contactos definidos para incluir, esto sería mejor que la asignación manual de una gran cantidad de variables que el valor de las constantes.

+0

Wow tio ... ¡este código es genial! ¡Nunca pensé que pudiera usar funciones dentro de heredoc de esta manera! Gracias por compartir ! – tftd

+0

Como dije, es un poco intrincado. El crédito tiene que dirigirse al creador del código en el manual de PHP. Hay algunas gemas de expertos serios allí. –

+0

Esto me parece una evaluación. ^^ –

4

Puede crear una clase que actúa como un descriptor de acceso a las constantes:

class DefineAccessor { 
    function __get($name) { 
     if (defined($name)) 
      return eval('return ' . $name . ';'); 
    } 
} 

Crear una instancia del mismo para poder utilizarlo en heredoc:

$defines = new DefineAccessor; 

y luego usarlo como esto:

echo <<<HTML 
Defined: $defines->TEST 
HTML; 
+0

Esta es una solución bonita y reutilizable, una especie de fastidio que es necesario sin embargo. –