2011-06-13 18 views
17

Mi lectura de the manual (el bit justo antes del encabezado de sección "Acceso de cadena y modificación por carácter") es que puedes hacer algunos trucos con constantes de clase y {} dentro de una cadena pero no puede hacer lo simple que haría que este método devuelva la verdad:Constante de clase en una cadena en PHP

class c { 
    const k = '12'; 
    public function s() { 
     return "Twelve in decimal is {c::k}."; 
    } 
} 

¿Es la solución correcta aquí para concatenar?

+0

Como la concatenación funciona, ¿por qué _no debería_ concatenar? – tplaner

+7

@evolve: la pregunta es sobre el lenguaje PHP, no sobre lo que constituye un buen código. ¿Por qué me gustaría o no concatenar (si tuviera la opción) está al lado del punto. –

+0

En caso de que alguien se pregunte por qué no desea concatenar; es posible que esté utilizando _heredoc_ cadenas en lugar de cadenas entre comillas dobles. Ambas expanden las variables, pero los heredocs realmente no funcionan bien con la concatenación. –

Respuesta

9

¿Es la solución correcta aquí para concatenar?

Sí. La sintaxis rizada extendida no lo admite.

Alternativamente, podría exportar la lista de constantes a una matriz y usarla (o exportar la constante a un único nombre de variable escalar), pero esa no es realmente una buena solución de IMO.

Tenga en cuenta que las constantes están disponibles, como se puede hacer esto:

const k = 'foo'; 
$foo = 'bar'; 
echo "{${c::k}}" 

dándole bar, pero eso no es lo que quiere.

7

Es un poco críptico, pero hay una nota al respecto en el manual.

Funciones, llamadas de método, variables de clase estáticas y constantes de clase dentro de {$} trabajo desde PHP 5. Sin embargo, el valor accedido se interpretará como el nombre de una variable en el ámbito en el que se define la cadena . El uso de llaves simples ({}) no funcionará para acceder a los valores de retorno de funciones o métodos o los valores de las constantes de clase o variables de clase estáticas.

La última frase le dice que no va a funcionar de manera sí, la concatenación es el camino a seguir aquí.


(modificado) Ejemplo de párrafo anterior:

<?php 
class beers { 
    const softdrink = 'rootbeer'; 
} 

$rootbeer = 'A & W'; 

// This works; outputs: I'd like an A & W 
echo "I'd like an {${beers::softdrink}}\n"; 

// This won't work; outputs: I'd like an {beers::softdrink} 
echo "I'd like an {beers::softdrink}\n"; 
+0

Esa es precisamente la parte del manual al que hice referencia en el PO y eso me confundió un poco. Pero creo que estamos de acuerdo en lo que significa. –

5

La sintaxis rizado sólo funciona para 'expresiones variables. Y necesita algo a lo que pueda acceder con {$.

Oh, sólo hay que solución:

$c = "constant"; 
    return "Twelve in decimal is {$c('c::k')}."; 

que es obviamente no es mucho más corto o más legible que simplemente usar la concatenación de cadenas aquí.

Cuestiones relacionadas