十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
在PHP面試中,經(jīng)常會(huì)遇到這樣一道問(wèn)題:
什么是變量引用,用什么符號(hào)表示?
我們提供的服務(wù)有:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、閻良ssl等。為千余家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的閻良網(wǎng)站制作公司
這個(gè)其實(shí)很簡(jiǎn)單,變量引用簡(jiǎn)單來(lái)說(shuō)就是不同的變量名稱指向同一個(gè)值。用&符號(hào)表示。
初學(xué)PHP,都知道變量的聲明與賦值為:
$a = str_replace("hello world",40);
我們可以將值再賦給$b
$b = $a;
這樣$a,$b都等于hello world,那在內(nèi)存中是不是開辟了2個(gè)空間來(lái)存儲(chǔ)呢?我們可以使用memory_get_usage()來(lái)查看:
$a =str_replace( 'hello world',40);
var_dump(memory_get_usage());
$b = $a;
var_dump(memory_get_usage());
你會(huì)發(fā)現(xiàn)內(nèi)存的值沒有變化。也就是說(shuō)變量a和b都指向了同一個(gè)內(nèi)存地址。
這里設(shè)計(jì)PHP的一個(gè)重要原則,是COW,即copy on write,意思就是說(shuō)只有在真的寫入的時(shí)候,才會(huì)復(fù)制出一塊內(nèi)存地址。
那我們繼續(xù)看:
var_dump(memory_get_usage());
$a = str_repeat('hello world',40);
var_dump(memory_get_usage());
$b = $a;
var_dump(memory_get_usage());
$a = str_repeat('hello teacher',40);
var_dump(memory_get_usage());
以上的代碼,就會(huì)發(fā)現(xiàn)當(dāng)$a重新賦值時(shí),內(nèi)存占用發(fā)生了變化 。
那再來(lái)看變量引用
var_dump(memory_get_usage());
$a = str_repeat('hello world',1);
var_dump(memory_get_usage());
$b = &$a;
var_dump(memory_get_usage());
$a = str_repeat('hello teacher',1);
var_dump(memory_get_usage());
echo $a;
echo '----------';
echo $b;
使用&符號(hào)以后,變量a和b使用一塊內(nèi)存地址,a發(fā)生變化后,b也隨著變化.
往底層來(lái)考慮
zval是php中最重要的數(shù)據(jù)結(jié)構(gòu)之一。
struct _zval_struct {
zvalue_value value; /* value */
zend_uint refcount__gc; /* variable ref count */
zend_uchar type; /* active type */
zend_uchar is_ref__gc; /* if it is a ref variable */
};
typedef struct _zval_struct zval;
以上是一段C語(yǔ)言代碼,這是zval的定義,一共有四個(gè)值,
zvalue是變量的實(shí)際值
uchar 是變量的的類型,比如PHP中的常用變量:bool、int、float、array、string、object、NULL等
refcount_gc:是一個(gè)計(jì)數(shù)器,當(dāng)我們把變量覆值給另一個(gè)變量時(shí),計(jì)數(shù)器加1,unset計(jì)數(shù)器減1,簡(jiǎn)單來(lái)說(shuō)就是有多少個(gè)變量指向它。
is_ref__gc:這個(gè)值分為0和1,代表是否為引用變量
結(jié)論就是PHP底層的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì) 決定了引用變量和變量賦值的原理。
注:對(duì)象類型本身就是引用傳遞。