Are multiple variable assignments done by value or reference?

后端 未结 7 2124
天命终不由人
天命终不由人 2020-12-10 00:33
$a = $b = 0;

In the above code, are both $a and $b assigned the value of 0, or is $a just refer

相关标签:
7条回答
  • 2020-12-10 00:54

    Regard this code as:

    $a = ($b = 0);
    

    The expression $b = 0 not only assigns 0 to $b, but it yields a result as well. That result is the right part of the assignment, or simply the value that $b got assigned to.

    So, $a gets assigned 0 as well.

    0 讨论(0)
  • 2020-12-10 00:57

    With raw types this is a copy.

    test.php

    $a = $b = 0;
    
    $b = 3; 
    
    var_dump($a);
    var_dump($b);
    

    Output:

    int(0) 
    int(3)
    

    With objects though, that is another story (PHP 5)

    test.php

    class Obj
    { 
        public $_name;
    }
    
    $a = $b = new Obj();
    
    $b->_name = 'steve';
    
    var_dump($a);
    var_dump($b);
    

    Output

    object(Obj)#1 (1) { ["_name"]=> string(5) "steve" } 
    object(Obj)#1 (1) { ["_name"]=> string(5) "steve" }
    
    0 讨论(0)
  • 2020-12-10 01:08

    its assigns them both the value of 0

    0 讨论(0)
  • 2020-12-10 01:11

    It depends what're you assigning.

    If you're assigning a value, then the assignment copies the original variable to the new one.

    Example 1:

    $a = $b = 0;
    $b++; echo $a;
    

    Above code will return 0 as it's assignment by value.

    Example 2:

    $a = ($b = 4) + 5; // $a is equal to 9 now, and $b has been set to 4.
    

    An exception to the usual assignment by value behaviour within PHP occurs with objects, which are assigned by reference in PHP 5 automatically. Objects may be explicitly copied via the clone keyword.

    Example 3

    $a = $b = $c = new DOMdocument();
    $c->appendChild($c->createElement('html'));
    echo $a->saveHTML();
    

    Above code will print <html></html>.

    0 讨论(0)
  • 2020-12-10 01:16

    I'll recommend a good read on this: http://terriswallow.com/weblog/2007/multiple-and-dynamic-variable-assignment-in-php/ . In one of comments, you can read:

    It should be noted that if you use multiple assignment on one line to assign an object, the object is assigned by reference. Therefore, if you change the value of the object’s property using either variable, the value essentially changes in both.

    So I'll personally recommend that you assign the variables separately.

    For the record:

    $a = $b = 4;
    var_dump($a, $b);
    $b = 5;
    var_dump($a, $b);
    

    Yields:

    int(4)
    int(4)
    int(4)
    int(5)
    

    But:

    class Tmp
        {
        public $foo;
    
        public function __construct()
            {
            $this->foo = 'bar';
            }
        }
    
    $a = $b = new Tmp();
    var_dump($a, $b);
    $a->foo = 'oth';
    var_dump($a, $b);
    

    Yields:

    object(Tmp)#1 (1) {
      ["foo"]=>
      string(3) "bar"
    }
    object(Tmp)#1 (1) {
      ["foo"]=>
      string(3) "bar"
    }
    object(Tmp)#1 (1) {
      ["foo"]=>
      string(3) "oth"
    }
    object(Tmp)#1 (1) {
      ["foo"]=>
      string(3) "oth"
    }
    

    So the conclusion is that there is no reference for primitives, but there IS a reference to objects.

    0 讨论(0)
  • 2020-12-10 01:16

    Both $a and $b are assigned that value of 0. If you wanted $a to reference $b, you would preempt it with an ampersand, e.g.:

    $a = & $b = 0;
    

    http://php.net/manual/en/language.oop5.basic.php

    0 讨论(0)
提交回复
热议问题