您的位置:首页 > 编程语言 > PHP开发

php - 多个变量指向同一个引用($b = &$a)

2017-06-02 11:51 274 查看
引用是什么?

引用就是多个变量指向同一个内存区域地址。如我们经常用的实例一个类,就是内存中开辟了一个区域存储实例的类,实例赋值给变量就是让这个变量指向这个内存区域。

多个变量指向同一个引用有什么好处?

节约了内存空间,多个变量指向同一个内存地址,在调用的时候多个变量都是指向的同一个内存地址。

多个变量指向同一个引用的缺点

要注意使用安全,即是由于多个变量都是指向的同一个内存地址,其中一个变量更改了某个属性,其它的变量调用的时候都是用的已经更改的实例。

在php 中我们为一个变量赋值的时候会在内存中开辟一个区域存储该值。那么我们将这个变量赋值给另一个变量的时候会在内存中重新开辟一个区域去存储改值吗? 我做了如下实验

<?php
$d = "aaa";

$c = $d;

echo $c . "<br />";

$d = "bbb";

echo $c . "<br />";

/**
* 执行结果是
* aaa
* aaa
*/
?>


看到这里 不知道你理解了没有,创建的变量
$d
并为之赋初始值aaa 再将
$d
赋值给
$c
,之后输出
$c
然后更改
$d
的值,在输出
$c
。这个实验告诉我们,
$d
再给
$c
赋值的时候是在内存中重新开辟了一个区域的。

那么,我们怎么才能让
$d
$c
都指向一个引用呢? 查了下资料 如下方法 让两个变量指向同一个内存地址

<?php
$a = "123";

$b = &$a;

echo $b."<br />";

$a = "456";

echo $b;

/**
* 运行结果如下
* 123
* 456
*/
?>


我更改了一下变量的名字。方便测试发现区别。在这里我们可以看到
$b=&$a
其中&符号的作用就是让
$b
指向的是
$a
的内存区域,而不是重新开辟一个区域。所以当更改
$a
的值的时候
$b
也会随着变化。

前面我们实验的对象是基本字符串,现在我们来看下类是否遵从这个规则

<?php
class Demo
{
public $demo = "aaaa";
}

$demo1 = new Demo();

$demo2 = $demo1;

echo $demo2->demo . "<br />";

$demo1->demo = "bbbb";

echo $demo2->demo . "<br />";

/**
* 运行结果
* aaaa
* bbbb
*/
?>


我这里并没有&符号指定
$demo2
必须指向
$demo1
的内存区域,所以关于类,当一个实例变量赋值给另一个变量的时候默认就是两个变量指向同一个引用;

php 的引用我觉得没有 java的好用,也许是这门语言本身还在发展,很多处理还没有那么方便完善。 java初去基本数据类型(int、long、byte、short、char、boolean、float、double等),两个变量赋值都是指向同一个内存地址,而且不用你特意去指定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: