php - 引用、指针和标识符有什么区别?
问题描述
我正在阅读有关 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 )
解决方案
根据php 文档:
默认情况下,函数参数是按值传递的(因此,如果函数内的参数值发生变化,它不会在函数外发生变化)。要允许函数修改其参数,它们必须通过引用传递。
要使函数的参数始终通过引用传递,请在函数定义中的参数名称前添加一个与号 (&)。
在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
推荐阅读
- json - 如何在PowerShell中访问名称由星号组成的属性?
- python - Python3没有名为配置的模块
- java - 使用 fabric8io 在 openshift 集群中创建模板
- javascript - 如何为每 10 个元素增加计数器
- python - 有没有办法根据修改日期查询 FTP 服务器以获取特定文件?
- jquery - 在jquery中选择标题下方的文本
- php - PHP PostGres 插入两个引号
- python - 如何在使用 python 进行正则表达式匹配后捕获 5 行
- trigonometry - CesiumJS计算折线和圆区域之间的相交
- laravel - 从数据库添加规则和验证值