引用,指针和标识符之间有什么区别?

时间:2018-07-06 11:35:10

标签: php oop object pass-by-reference

我正在阅读有关OOP概念的PHP手册link,并遇到了一些我无法理解的示例。

a)有人可以解释这些对象是通过值传递还是通过引用传递?

b)什么是引用,指针和标识符,它们之间有什么区别?

示例1:

class A {
    public $foo = 1;
}  

class B {
    public function foo(A $bar)
    {
        $bar->foo = 42;
    }

    public function bar(A $bar)
    {
        $bar = new A;
    }
}

$f = new A;
$g = new B;
echo $f->foo . "n";

$g->foo($f);
echo $f->foo . "n";

$g->bar($f);
echo $f->foo . "n";
  

预期输出:

1
42
1

  

返回的输出:

1
42
42

示例2:

class A
{
    public $v = 1;
}

function change($obj)
{
    $obj->v = 2;
}

function makezero($obj)
{
    $obj = 0;
}

$a = new A();

change($a);    
print_r($a); 
//Expected: A Object ( [v] => 2 ) 
//Returned: A Object ( [v] => 2 )  

makezero($a);    
print_r($a);
//Expected: 0 
//Returned: A Object ( [v] => 2 ) 

Reference 1

Reference 2

1 个答案:

答案 0 :(得分:0)

根据php docs

  

默认情况下,函数参数按值传递(因此,如果   函数内参数的值被更改,它不会得到   在函数外部更改)。允许函数修改其   参数,它们必须通过引用传递。

     

要使函数的参数始终通过引用传递,请添加前缀   函数定义中参数名称的&符号。

B::foo中,您不会更改变量,但会更改变量对象的属性。那就是为什么你得到42

B::bar中,您直接更改变量。它已更改为A的新实例。在B::bar内,$bar->foo === 1的值。

指针: 每当创建对象并将其分配给变量时,都会生成指针。此变量存储用于访问对象的内存地址。

参考: 引用以与号(&)创建。

//from your link posted
$a = new Foo; // $a is a pointer pointing to Foo object 0
$b = $a; // $b is a pointer pointing to Foo object 0, however, $b is a copy of $a
$c = &$a; // $c and $a are now references of a pointer pointing to Foo object 0