有什么区别,(逗号)和.(点)作为串联运算符?

Rah*_*ara 6 php

这是简单的PHP代码

echo '<form method="POST" action="calcbyme.php"></br>
    enter value1 :<input type="text" name="f1"></br>
    give operator :<input type="text" name="op"></br>
    enter value2 :<input type="text" name="f2"></br>
    <input type="submit" value="calculate"></br>';
    if(isset( $_POST["f1"]) && isset($_POST["f2"]) && isset($_POST["op"]) ){
        $a=$_POST["f1"];
        $b=$_POST["f2"];
        $op=$_POST["op"];
        switch ($op){
            case '+':
                echo "$a+$b=". $a+$b; break;
            case '-':
                echo  "$a-$b=". $a-$b; break;
            case '*':
                echo "$a*$b=". $a*$b; break;
            case '/';
                echo "$a/$b=". $a/$b; break;
            default:
                echo "invalid operator"; break;
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果我假设$a=4,$b=2 但这只给出这样的价值

6
2
8
2
Run Code Online (Sandbox Code Playgroud)

如果我把,(逗号)而不是.(点)然后它给出正确的输出

4+2=6
4-2=2
4*2=8
4/2=2
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Vyk*_*tor 3

它与 php运算符优先级有关...

包含的表达式.在包含 的表达式之前执行+,因此隐式括号是:

.+-是相等运算符(它们没有优先级)并且它们从开始到结束顺序执行,因此隐式括号是:

echo ("$a+$b=". $a)+$b
Run Code Online (Sandbox Code Playgroud)

因此,如果你想要正确的输出,你应该使用:

echo "$a+$b=". ($a+$b)
Run Code Online (Sandbox Code Playgroud)

经验例子:

php > echo "foo" . 1 + 2;
// 2
php > echo "foo" . (1 + 2);
// foo3
php > echo 1 + 3 . 'foo';
// 4foo
Run Code Online (Sandbox Code Playgroud)

为什么,有效...因为逗号分隔函数参数并且 php 将其视为:

echo( "$a+$b=", $a+$b);
Run Code Online (Sandbox Code Playgroud)

逗号运算符 ( ,) 被评估为最后一个。