php 引用變數知識點

2021-08-15 20:51:15 字數 3541 閱讀 1894

一、什麼是引用變數?在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...