首页 > 解决方案 > 引用、指针和标识符有什么区别?

问题描述

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

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 ) 

参考1

参考文献 2

标签: phpoopobjectpass-by-reference

解决方案


根据php 文档

默认情况下,函数参数是按值传递的(因此,如果函数内的参数值发生变化,它不会在函数外发生变化)。要允许函数修改其参数,它们必须通过引用传递。

要使函数的参数始终通过引用传递,请在函数定义中的参数名称前添加一个与号 (&)。

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

B::bar您直接更改变量。它被更改为 的新实例AB::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

推荐阅读