代码之家  ›  专栏  ›  技术社区  ›  nonopolarity

是否有简单的PHP代码来区分“将对象作为引用传递”和“将对象引用作为值传递”?

  •  1
  • nonopolarity  · 技术社区  · 14 年前

    这与问题有关: How does the "&" operator work in a PHP function?

    有没有简单的代码来显示

    将对象作为引用传递

    VS

    是否将对象的引用作为值传递?

    3 回复  |  直到 8 年前
        1
  •  2
  •   Mahsin    8 年前

    可以通过引用将变量传递给函数。此函数将能够修改原始变量。

    您可以在函数定义中通过引用定义通道:

    <?php
    function changeValue(&$var)
    {
        $var++;
    }
    
    $result=5;
    changeValue($result);
    
    echo $result; // $result is 6 here
    ?>
    
        2
  •  0
  •   Ipsita Rout    11 年前
    <?php
    class X {
        var $abc = 10; 
    }
    class Y {
        var $abc = 20; 
        function changeValue(&$obj){//1>here the object,$x is a reference to the object,$obj.hence it is "passing the object's reference as value"
            echo 'inside function :'.$obj->abc.'<br />';//2>it prints 10,bcz it accesses the $abc property of class X, since $x is a reference to $obj.
            $obj = new Y();//but here a new instance of class Y is created.hence $obj became the object of class Y.
            echo 'inside function :'.$obj->abc.'<br />';//3>hence here it accesses the $abc property of class Y.
        }
    }
    $x = new X();
    $y = new Y();
    
    $y->changeValue($x);//here the object,$x is passed as value.hence it is "passing the object as value"
    echo $x->abc; //4>As the value has been changed through it's reference ,hence it calls $abc property of class Y not class X.though $x is the object of class X
    ?>
    

    O/P:

    inside function :10
    inside function :20
    20
    
        3
  •  0
  •   Dan King    10 年前

    这个怎么样?

    <?php
    class MyClass {
        public $value = 'original object and value';
    }
    
    function changeByValue($originalObject) {
        $newObject = new MyClass();
        $newObject->value = 'new object';
    
        $originalObject->value = 'changed value';
    
        // This line has no affect outside the function, and is
        // therefore redundant here (and so are the 2 lines at the
        // the top of this function), because the object
        // "reference" was passed "by value".
        $originalObject = $newObject;
    }
    
    function changeByReference(&$originalObject) {
        $newObject = new MyClass();
        $newObject->value = 'new object';
    
        $originalObject->value = 'changed value';
    
        // This line changes the object "reference" that was passed
        // in, because the "reference" was passed "by reference".
        // The passed in object is replaced by a new one, making the
        // previous line redundant here.
        $originalObject = $newObject;
    }
    
    $object = new MyClass();
    echo $object->value;  // 'original object and value';
    
    changeByValue($object)
    echo $object->value;  // 'changed value';
    
    $object = new MyClass();
    echo $object->value;  // 'original object and value';
    
    changeByReference($object)
    echo $object->value;  // 'new object';