Heim  >  Fragen und Antworten  >  Hauptteil

php - Welche Auswirkungen wird die kaufmännische Und-Referenzübergabe auf die Operationsergebnisse haben?

$a = 1;
$b = &$a; //Adresse übergeben. Das Auskommentieren dieser Zeile gibt 5 zurück. Wenn sie nicht auskommentiert ist (PHP-Version <7), wird 6 zurückgegeben
$c = (++$a) + (++$a);
echo $c;
Ist es verwandt? zur Version? Außerdem ist das Ergebnis 6, was für mich wirklich rätselhaft ist

PHP中文网PHP中文网2676 Tage vor687

Antworte allen(3)Ich werde antworten

  • typecho

    typecho2017-06-21 10:12:41

    先说一下加上了引用赋值的操作

    $b = &$a;

    这个操作,可以认为,$a$b都指向原本$a变量所在的那块内存(为了方便后面解释,称为内存X),也就是说,后面任何对于$a或者$b的操作,都是在直接对这块内存里的值进行修改。

    所以加上这一行之后的运行流程:

    1. 前面步骤省略,初始a为1

    2. $c = (++$a) + (++$a)的两次++$a都是在操作内存X,也就是把内存X里的值自增了两次,所以,在运算$c的值的时候,取的是这个内存里数的值,也就是自增了两次之后的内存X里的值。所以,是3 + 3 = 6(运算$c时候,内存X里存的值是3)。

    再说一下注释了引用之后的操作

    如果不加引用,那么对于$a的自增接操作直接修改内存X,而后通过运算符操作返回内存X的副本,这样,两次的++$a结果由于不是直接从内存X获取的,而是改变内存X值之后的副本,所以$c在运算的时候就是2 + 3 = 5

    Antwort
    0
  • phpcn_u1582

    phpcn_u15822017-06-21 10:12:41

    这个跟PHP的底层实现有关,说起来很长,推荐看一下github上同样问题的解析
    一个PHP bug引发的探索:
    https://github.com/xurenlu/ph...

    Antwort
    0
  • 学习ing

    学习ing2017-06-21 10:12:41

    你输出C,C跟你的B有什么关系?

    Antwort
    0
  • StornierenAntwort