2012-07-19 5 views
6

Czy to zachowanie jest poprawne w PHP?Pierwszeństwo nadawania typu PHP

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

I zrozumieć, że minus jest dołączona do pierwszej „1” i „-1” odlewano do liczby całkowitej, a nie „2” na sznurkiem.

Proszę wyjaśnić, dlaczego.

Jaki jest najlepszy sposób na rozwiązanie problemu? Ten?

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

zaskoczony, nie jest to dupe .. więc +1 – Louis

Odpowiedz

1

Jeśli wolisz, to unika pierwszeństwo:

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

Przede wszystkim, jest to poprawne, a jeśli byłoby inaczej byłoby także poprawne, to w jaki sposób programiści PHP zdefiniowane operandu pierwszeństwo.
W tym scenariuszu nie operand ma pierwszeństwo, więc u przeczytać go od lewej do prawej

  1. '-' . 1 ==> '-1'
  2. '-1' + 1 ==> 0 (operacji arytmetycznych na łańcuchach, będzie starał się rzucić im numerów, a następnie wykonaj arytmetyki).
  3. 0 . ' crazy cats' ==> "0 crazy cats" (wykonuje operacje na liczbach, rzuca je na łańcuchy).
+2

Argh, byłeś szybszy niż ja :) BTW, Operator pierwszeństwo jest dostępny na stronie internetowej: // php.net/manual/en/language.operators.precedence.php. –

1

Twoje słownictwo jest wyłączone. Model '-' nie jest rzucany, ale zmieniany.

PHP będzie nadal traktować (string) 1 i -1 jako liczbę całkowitą.

. i +/- mają takie samo pierwszeństwo w PHP, więc ciąg może być czytany od lewej do prawej.

Powyższe jest podobna do stwierdzenia:

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

Minus nie jest oczywiście rzucany, poprawił pytanie. – Paker

4

Jeśli chcesz -2 szalonych kotów, można ustawić priorytet manipulować nawiasie:

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

echo wynika również konstrukt echo 'foo', 'bar' który dzieli elementy na odrębne zdania na echo. W takim przypadku nie musisz martwić się o kolejność łączenia.

Więc możesz zrobić <?php echo '-', (1 + 1), ' crazy cats'; ?>, a twoje koty nie będą przejmować się negatywami!