多個變數指向同一個引用($b = &$a)
引用是什麼?
引用就是多個變數指向同一個記憶體區域地址。如我們經常用的例項一個類,就是記憶體中開闢了一個區域儲存例項的類,例項賦值給變數就是讓這個變數指向這個記憶體區域。
多個變數指向同一個引用有什麼好處?
節約了記憶體空間,多個變數指向同一個記憶體地址,在呼叫的時候多個變數都是指向的同一個記憶體地址。
多個變數指向同一個引用的缺點
要注意使用安全,即是由於多個變數都是指向的同一個記憶體地址,其中一個變數更改了某個屬性,其它的變數呼叫的時候都是用的已經更改的例項。
在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等),兩個變數賦值都是指向同一個記憶體地址,而且不用你特意去指定。