我正在阅读有关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 )
答案 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