How do you pass objects by reference in PHP 5?

后端 未结 3 1784
没有蜡笔的小新
没有蜡笔的小新 2020-11-30 03:58

In PHP 5, are you required to use the & modifier to pass by reference? For example,

class People() { }
$p = new People();
function one($a) {         


        
3条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-30 04:42

    are you required to use the & modifier to pass-by-reference?

    Technically/semantically, the answer is yes, even with objects. This is because there are two ways to pass/assign an object: by reference or by identifier. When a function declaration contains an &, as in:

    function func(&$obj) {}
    

    The argument will be passed by reference, no matter what. If you declare without the &

    function func($obj) {}
    

    Everything will be passed by value, with the exception of objects and resources, which will then be passed via identifier. What's an identifier? Well, you can think of it as a reference to a reference. Take the following example:

    class A
    {
        public $v = 1;
    }
    
    function change($obj)
    {
        $obj->v = 2;
    }
    
    function makezero($obj)
    {
        $obj = 0;
    }
    
    $a = new A();
    
    change($a);
    
    var_dump($a); 
    
    /* 
    output:
    
    object(A)#1 (1) {
      ["v"]=>
      int(2)
    }
    
    */
    
    makezero($a);
    
    var_dump($a);
    
    /* 
    output (same as before):
    
    object(A)#1 (1) {
      ["v"]=>
      int(2)
    }
    
    */
    

    So why doesn't $a suddenly become an integer after passing it to makezero? It's because we only overwrote the identifier. If we had passed by reference:

    function makezero(&$obj)
    {
        $obj = 0;
    }
    
    makezero($a);
    
    var_dump($a);
    
    /* 
    output:
    
    int(0) 
    
    */
    

    Now $a is an integer. So, there is a difference between passing via identifier and passing via reference.

提交回复
热议问题