2011-11-09 10 views
7

Acabo de encontrar un fragmento de mi código que tenía un error tipográfico en él.Typo produce resultados inesperados en PHP

$msg = "Some text"; 
$msg .= " some more text"; 
$msg .+ " yet more text!"; 
$msg .= " last text"; 

Aviso .+ la que debe ser .=. Lo que me sorprende es que el código corrió sin producir ningún error, advertencia o aviso y la salida fue:

Some text some more text last text

Me preguntaba por qué hacía eso. Sé muy bien qué son .= y += pero cómo se interpreta .+ especialmente porque no hay un signo igual.

Respuesta

10

No hay operador .+, por lo que es . seguido de +.

Estás construyendo una expresión que consiste en $msg concatenado con el resultado de aplicar a unario +" yet more text!" (which is 0 debido a la conversión a número entero) ... y luego desechar todo el asunto porque no se está haciendo nada con el resultado.

$msg .+ " yet more text!"; 
$msg . +" yet more text!"; // 1. PHP doesn't care about the spacing 
$msg . 0;     // 2. Conversion to int from unary `+` 
$msg . "0";    // 3. Coersion to string for concatenation 
          // 4. Nothing done with value 

Es perfectamente válido; simplemente no hace nada útil.

+0

Gracias por la entrada! – Iznogood

+1

@lznogood: ¡No hay problema! Vale la pena considerar aquí lo que sucede si pones la expresión '" hola; '' como una declaración solitaria: nada. Ese es realmente el quid de esta pregunta. –

+0

¡bien! ¡Gracias de nuevo! – Iznogood

2

El + se interpreta como un plus adicional. PHP convierte la cadena en un entero con el valor 0 y lo concatena con $msg. Sin embargo, no asigna $msg nada en esa línea, por lo que $msg no se cambiará.

+0

¡Gracias por la entrada! +1! – Iznogood

1

Esto funciona porque . es el operador de concatenación, y + es el operador de suma.

La línea consiguió interpretarse como esto:

$msg . (+" yet more text!"); 

La expresión +" yet more text!" convierte la cadena a un int (0 en este caso como cuando PHP convierte una cadena a un int, se detiene en la primera no número personaje). Luego se ocupó del 0 al $msg e ignoró el resultado.

+0

¡Gracias por la entrada! +1! – Iznogood

+0

@Iznogood: No hay problema :-) –

Cuestiones relacionadas