2014-04-02 117 views
-1

考虑:'42'从哪里来?

php > echo '1 + 5' * '42 + 1' . "\n"; 
42 

我期待某种错误或警告,但PHP让我们乘串毫无怨言。但是,为什么它会显示第二个字符串中的第一个整数?

一些例子,对此我能找到的结果背后没有真正的合乎逻辑的理由:

php > echo '1 hi' * '42 + 1' . "\n"; 
42 
php > echo 'hi' * '42 + 1' . "\n"; 
0 
php > echo '1 + 5' * '42 + hi' . "\n"; 
42 
php > echo '1 + 5' * '42 hi' . "\n"; 
42 
php > echo '1 + 5' * '42hi' . "\n"; 
42 
+1

** 8 **?我不知道你在说什么8? –

+0

http://www.php.net/manual/en/language.types.type-juggling.php – PeeHaa

+0

和https://eval.in/130579 – PeeHaa

回答

6

PHP尝试将字符串转换为数字在飞行并执行基于其获得的数学。当一个字符串以非数字开头时,它会转换为零 - 因此您的答案。

当PHP转换这些,它是在一个从左到右的方式进行:

字符串1 + 5实际上转换为数字1 - 那么42 + 1转换为42.你的陈述因此1 * 42和结果是42的一个回声。你用0回答的陈述,你试图乘以hi(它被转换为零),因此你得到零的结果。

编辑:至于它为什么回应出答案而不是字符串 - 这只是由于运算符的优先级。数学运算符的排名高于字符串运算符 - 所以它将它视为应该解决的问题,然后回应它应该回应的内容。

+0

谢谢。我没有意识到这些琴弦正在被投入整版,然后产品被重铸成弦乐。如上所述,答案显而易见。 – dotancohen

+0

没有probs,PHP是一件有趣的事情。有时候你可以阅读几个小时的手册,找不到你想要的东西,其他时候你只是在正确的答案中发生的时候 - 哦,当你认为你已经制定出PHP的每一个技巧,它会再次欺骗你。 – Fluffeh