一、什麼是引用變數?在php中,用什麼符號定義引用變數?
引用變數:用不同的名字訪問同乙個變數內容
定義方式:使用&符號
二、引用變數衍生知識點
1、寫時複製(copy on write)
<?php
/** * 演示寫時複製(copy on write)
*/var_dump(memory_get_usage());//357896
// 定義乙個變數
$a = range(0, 1000);
var_dump(memory_get_usage());//386616
// 定義變數b,將a變數的值賦值給b,此時a和b公用乙個空間
// cow copy on write
$b = $a;
var_dump(memory_get_usage());//386616
// 對a進行修改,此時對b拷貝乙份,再對a重新開闢資料空間
$a = range(0, 1000);
var_dump(memory_get_usage());//415336
2、針對上面程式改為引用變數後,效果又不一樣
<?php
/** * 引用變數,a和b都是公用一塊空間
*/var_dump(memory_get_usage());//357720
// 定義乙個變數
$a = range(0, 1000);
var_dump(memory_get_usage());//386440
// 定義變數b,將a變數的值賦值給b
$b = &$a;
var_dump(memory_get_usage());//386464
// 對a進行修改,由於a和b公用一塊空間,所以此步驟不會導致a和b都各自占用各自空間
$a = range(0, 1000);
var_dump(memory_get_usage());//386464
3、檢視寫時複製時php核心zval結構體資料
<?php
/** * 檢視寫時複製時php核心zval結構體資料
* refcount: 指向這個zval變數容器的變數個數
* is_ref:是否被引用
*/// zval變數容器
$a = range(0, 3);
xdebug_debug_zval('a');//refcount=1, is_ref=0)
// 定義變數b,把a的值賦值給b
$b = $a;
xdebug_debug_zval('a');//refcount=2, is_ref=0)
// 修改a
$a = range(0, 3);//此處進行寫時拷貝,refcount減1
xdebug_debug_zval('a');//refcount=1, is_ref=0
xdebug_debug_zval('b');//refcount=1, is_ref=0
4、檢視寫時改變時php核心zval結構體資料
<?php
/** * 檢視寫時改變時php核心zval結構體資料
* refcount: 指向這個zval變數容器的變數個數
* is_ref:是否被引用
*/$a = range(0, 3);
xdebug_debug_zval('a');//refcount=1, is_ref=0
$b = &$a;
xdebug_debug_zval('a');//refcount=2, is_ref=1
$a = range(0, 3);
xdebug_debug_zval('a');//refcount=2, is_ref=1
$c = $a;//寫時改變
xdebug_debug_zval('a');//refcount=2, is_ref=1
xdebug_debug_zval('b');//refcount=2, is_ref=1
xdebug_debug_zval('c');//refcount=2, is_ref=0
5、unset:只會取消引用,不會銷毀空間
<?php
/** * unset 只會取消引用,不會銷毀空間
*/$a = 1;
$b = &$a;
unset($b);
echo $b. "\n";//notice: undefined variable
echo $a. "\n";//1
6、物件本身就是引用傳遞
<?php
/** * 物件本身就是引用傳遞
*/class person
$p1 = new person;
xdebug_debug_zval('p1');
$p2 = $p1;
xdebug_debug_zval('p1');
$p2->name = "lisi";
xdebug_debug_zval('p1');
var_dump($p1->name);//lisi
var_dump($p2->name);//lisi
三、利用記憶體變數變動畫**決引用變數題目
<?php
/** * 引用變數程式題
* 寫出如下程式的輸出結果
* <?php
* * $data = ['a', 'b', 'c'];
* * foreach($data as $key => $val)
* * 程式執行時,每一次迴圈結束後變數$data的值是什麼?請解釋
* 程式執行完成後,變數$data的值是什麼?請解釋
*/$data = ['a', 'b', 'c'];
foreach ($data as $key=>$val)
var_dump($data);//['b','c','c']
/* * 最終結果為['b','c','c']
* 分析
* 第一次迴圈:
* key = 0;
* val = 'a';//val賦值為'a'
* val = &$data[0];//val指向data[0]
* * 第二次迴圈
* key = 1;
* val = 'b',//此處由於val引用data[0],那麼val='b',也相當於data[0] = 'b'
* val = &$data[1];val指向data[1]
* * 第三次迴圈
* key = 2;
* val = 'c',//此處由於val引用data[1],那麼val='c',也相當於data[1] = 'c'
* val = &$data[2];val指向data[2]
* * 最終陣列data的資料為['b','c','c']
*/
變數知識點
1預定義變數 1 server server addr 當前執行指令碼所在的伺服器的ip位址 2 server server name 伺服器主機的名稱 3 server request method 訪問頁面時的請求方法,如get,post,head,put等,如果請求的方式是head,php指令...
基本變數型別 和引用型別 知識點
ecmascript 變數可能包含兩種不同資料型別的值 基本型別值和引用型別值 基本型別值指的是儲存在棧記憶體的簡單的資料段,即這種值完全儲存在記憶體中的乙個位置。而引用型別值則是指那些儲存在堆記憶體中的物件,意思是變數中儲存的實際上只是乙個指標,這個指標指向記憶體中的另乙個位置,該位置儲存物件。基...
PHP知識點總結
其他isset 變數是否存在 boolean empty 檢查變數是否存在,並判斷值是否為非空或非0 void unset 銷毀變數 header content type text html charset utf 8 method exists obj,method 判斷物件的方法是否可用 fi...