2012-07-19 14 views
6

¿Es este comportamiento correcto en PHP?Preferencia de conversión del tipo de PHP

<?php echo '-' . 1 + 1 . ' crazy cats'; ?> 
// Outputs: 
0 crazy cats 

entiendo que menos se concatena con el primer '1' y '-1' fundido a un entero, y no '2' a cadena.

Explique por qué.

¿Cuál es la mejor manera de resolverlo? ¿Éste?

<?php echo '-' . (string)1 + 1 . ' crazy cats'; ?> 
+0

sorprendido esto no es una víctima .. así – Louis

Respuesta

1

Si lo prefiere, esto evita precedencia:

printf('-%d crazy cats',1+1); 
6

En primer lugar, es correcta, y si sería diferente también sería correcta, que es como definen los desarrolladores de PHP preferencia operando.
En este escenario, ningún operando tiene prioridad, por lo que u lo leen de izquierda a derecha

  1. '-' . 1 ==> '-1'
  2. '-1' + 1 ==> 0 (operaciones aritméticas sobre cuerdas, tratarán de echarlos a los números primero y luego hacer la aritmética).
  3. 0 . ' crazy cats' ==> "0 crazy cats" (cadenas de operaciones en números, los convertirá en cadenas).
+2

1 Argh, usted era más rápido que yo :) Por cierto, la precedencia del operador está disponible enhttp: // php.net/manual/en/language.operators.precedence.php. –

1

Your verbiage is off. El '-' no se va a castear, sino que se coloca.

PHP seguirá tratando (string) 1 y -1 como un número entero.

. y +/- tienen la misma precedencia en PHP, por lo que la cadena se puede leer de izquierda a derecha.

Lo anterior es similar a decir:

echo '-1' + '1 crazy cats'; 
+0

Menos no se fundió, por supuesto, corrigió la pregunta. – Paker

4

Si desea -2 gatos locos, puede establecer la prioridad de manipular con paréntesis:

echo '-' . (1 + 1) . ' crazy cats'; 
3

echo sigue también la construcción de la que echo 'foo', 'bar' separa los elementos en declaraciones distintas para hacer eco. No tiene que preocuparse por el orden de concatenación en ese caso.

¡Así que podría hacer <?php echo '-', (1 + 1), ' crazy cats'; ?> y a sus gatos no les importarían los negativos!

Cuestiones relacionadas