return语句中的算术会导致意外行为

时间:2017-04-20 21:32:42

标签: php

我目前正在从HTML,CSS和JS背景学习PHP,我遇到了一些让我感兴趣的意外行为。因此,我尝试了以下代码。

实验1:

似乎写入时返回语句是这样写的,算术之前的所有内容都被删除/不呈现。

代码:

<?php
    function add($num, $num2) {
      return $num."+".$num2." = ".$num + $num2."<br>";
    }

    echo add(10, 7) . add(20, 1);
?>

输出

17<br>
21<br>


实验2:

但是,当我将第一个变量/参数从$num更改为$num2时,似乎第一个变量和+运算符之间的每一个都被删除了。

代码:

<?php
    function add($num, $num2) {
      return $num2."+".$num2." = ".$num + $num2."<br>";
    }

    echo add(10, 7) . add(20, 1);
?>

输出

14<br>
2<br>


实验3:

在JS中trying后,我意识到在算术方程周围加上括号会输出预期的结果。

代码:

<?php
    function add($num, $num2) {
      return $num."+".$num2." = ".($num + $num2)."<br>";
    }

    echo add(10, 7) . add(20, 1);
?>

输出

10+7 = 17<br>
20+1 = 21<br>

(同时制作一个$sum变量可以解决问题)


问题:

我的问题是,通过不将方括号括在方程式周围会导致意外行为的原因是什么?

2 个答案:

答案 0 :(得分:2)

PHP如何知道您不想接受此$num."+".$num2." = ".$num并将其算术地添加到此$num2."<br>"?除非您使用括号使$num + $num2先发生。

,否则它不会

在第一个例子中:

$num."+".$num2." = ".$num 

等同于字符串:10+7=10,然后:

$num2

等同于7

当您尝试添加+时,字符串10+7=10必须转换为整数10,并且当添加到7时,您会17字符串<br>被连接起来。

请参阅PHP: String Conversion to Numbers

括号:

$num."+".$num2." = ".($num + $num2)."<br>";

您将字符串10+7=10+717)连接在一起,并与字符串<br>连接。

答案 1 :(得分:2)

您看到的行为是“类型杂耍”的结果。

因为PHP不是严格类型的,所以在需要时(或假设解释器需要)可以将字符串解释为整数,反之亦然。所以数据类型被转换,如果你不小心会导致问题。在许多其他语言中,如果您将字符串视为整数或整数(如字符串),则会出现错误。例如,JavaScript有String.parseInt()来明确更改类型。

口译员正在做的大致如下,一步一步:

  1. $num - 建立一个值为10
  2. 的整数
  3. 10."+" - 将整数与字符串连接起来

    • 将当前输出转换为字符串(10变为"10"),并附加加号
    • 现在输出"10+"
  4. "10+".$num2 - 将字符串与整数

    连接
    • 将整数转换为字符串并附加
    • 现在输出"10+7"
  5. "10+7"." = " - 连接2个字符串
    • 现在输出"10+7 = "
  6. "10+7 = ".$num - 将字符串与整数连接起来
    • 将整数转换为字符串并附加
    • 现在输出"10+7 = 10
  7. "10+7 = 10" + $num2 - 字符串和整数之间的算术计算
    • 将字符串转换为整数并将其添加到下一个整数。
    • 在这种情况下,当PHP将字符串转换为整数时,它从字符串的开头开始并返回所有数字,直到它到达第一个非数字,因此"10+7 = 10"拉出10,然后点击+并停止寻找数字。
    • 现在输出17;
  8. 17."<br>" - 整数和字符串的连接
    • 将整数转换为字符串并附加<br>
    • 现在输出17<br>
  9. 供参考: