老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)

PHP中引用的概念是什么

這篇文章主要介紹“PHP中引用的概念是什么”,在日常操作中,相信很多人在PHP中引用的概念是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”PHP中引用的概念是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

創(chuàng)新互聯(lián)專注于企業(yè)營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、武清網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5技術(shù)商城網(wǎng)站制作、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為武清等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

 

徹底搞明白PHP的中引用的概念

之前我們其實(shí)已經(jīng)有過(guò)幾篇文章講過(guò)引用方面的問(wèn)題,這次我們來(lái)全面的梳理一下引用在PHP到底是怎么回事,它和C中的指針有什么不同,在使用的時(shí)候要注意些什么。

 

什么是引用?

在 PHP 中引用意味著用不同的名字訪問(wèn)同一個(gè)變量?jī)?nèi)容。它不是C的指針,保存的并不是內(nèi)存地址,無(wú)法進(jìn)行指針運(yùn)算。引用只是符號(hào)表的別名。就像 Unix 系統(tǒng)中的硬鏈接, Windows 系統(tǒng)中的快捷方式。

上面是官方手冊(cè)中的原文,怎么說(shuō)呢,引用其實(shí)和我們印象中的C里面的指針并不是相同的概念。指針是針對(duì)真實(shí)內(nèi)存的操作,引用是針對(duì)指向這個(gè)內(nèi)存的符號(hào)表的操作。還是從操作系統(tǒng)的快捷方式來(lái)說(shuō),快捷方式是可以刪的,這就是PHP的引用。而C不僅刪了快捷方式,還把原文件也給刪了,這就是C的指針操作。

// 引用不是指針
$a = 1;
$b = &$a;
echo $a, '===', $b, PHP_EOL;
unset($b);
echo $a, '===', $b, PHP_EOL;
 

上面的代碼是在PHP中,我們把$b變量指向$a,作為$a的引用變量。然后刪除$b,對(duì)$a沒(méi)有任何影響。

#include 
#include 

int main()
{
    // C 中的指針和引用
    int a = 1;
    int* b = &a;
    printf("%i\n", a); // 1
    free(b); // free b
    printf("%i\n", a); //get error: *** error for object 0x7fff6350da08: pointer being freed was not allocated
    return 0;
}
 

而C中的引用指針就不行了,我們把b變量刪掉后,再打印a變量就直接報(bào)錯(cuò)了。

雖然說(shuō)PHP的底層也是C寫得,但我們都知道C中的指針是出了名的變態(tài),沒(méi)有一定的功底非常容易出錯(cuò)。所以PHP的開發(fā)者沒(méi)有暴露C的原始指針能力,而是采用了和Java之類的類似的引用能力。這也是現(xiàn)代語(yǔ)言的特性,不需要我們過(guò)多的關(guān)注過(guò)于底層的能力,而將更多的時(shí)間放在業(yè)務(wù)實(shí)現(xiàn)上。

 

引用在數(shù)組和對(duì)象中的使用

如果具有引用的數(shù)組被拷貝,其值不會(huì)解除引用。對(duì)于數(shù)組傳值給函數(shù)也是如此。

$arr1 = ["a", "b"];
$t1 = &$arr1[1];
$arr2 = $arr1;
$arr2[1] = "c";
var_dump($arr1);

// array(2) {
//     [0]=>
//     string(1) "a"
//     [1]=>
//     &string(1) "c"
// }

$arr1 = ["a", "b"];
$t1 = &$arr1[1];
unset($t1); // unset 掉引用
$arr2 = $arr1;
$arr2[1] = "c";
var_dump($arr1);

// array(2) {
//     [0]=>
//     string(1) "a"
//     [1]=>
//     string(1) "b"
// }
 

這個(gè)其實(shí)挺有意思的,我們對(duì)比這兩個(gè)例子可以看出一個(gè)問(wèn)題,$t變量指向$arr[1]的引用。$arr2直接=這個(gè)$arr1,沒(méi)有使用引用,然后$arr2修改了$arr2[1]的內(nèi)容,$arr1相應(yīng)的內(nèi)容也發(fā)生了改變,如果unset掉$t變量,則$arr1相應(yīng)的內(nèi)容就不會(huì)發(fā)生改變。對(duì)此,我在文檔中找到了下面的解釋:

由于PHP內(nèi)部工作的特殊性,如果對(duì)數(shù)組的單個(gè)元素進(jìn)行引用,然后復(fù)制數(shù)組,無(wú)論是通過(guò)賦值還是通過(guò)函數(shù)調(diào)用中的值傳遞,都會(huì)將引用復(fù)制為數(shù)組的一部分。這意味著對(duì)任一數(shù)組中任何此類元素的更改都將在另一個(gè)數(shù)組(和其他引用中)中重復(fù),即使數(shù)組具有不同的作用域(例如,一個(gè)是函數(shù)內(nèi)部的參數(shù),另一個(gè)是全局的)!在復(fù)制時(shí)沒(méi)有引用的元素,以及在復(fù)制數(shù)組后分配給其他元素的引用,將正常工作(即獨(dú)立于其他數(shù)組)。

不僅僅是數(shù)組,對(duì)象的引用也會(huì)有一些好玩的問(wèn)題。

$o1 = new stdClass();
$o1->a = 'a';
var_dump($o1);
// object(stdClass)#1 (1) {
//   ["a"]=>
//   string(1) "a"
// }

$o2 = &$o1;
$o3 = $o1;

$o2->a = 'aa';

var_dump($o1);
// object(stdClass)#1 (1) {
//   ["a"]=>
//   string(2) "aa"
// }

var_dump($o3); // $o2修改了$a為'aa',$o3也變成了'aa'
// object(stdClass)#1 (1) {
//   ["a"]=>
//   string(2) "aa"
// }

$o1->a = 'aaa';
$o1 = null;
var_dump($o2); // $o2引用變成了null
// NULL

var_dump($o3); // $o3不僅引用還存在,并且$a變成了'aaa'
// object(stdClass)#1 (1) {
//   ["a"]=>
//   string(3) "aaa"
// }
 

上面例子中有三個(gè)對(duì)象,$o1、$o2、$o3,其中,$o2是對(duì)$o1的引用,$o3是直接賦值為$o1。對(duì)$o2屬性的操作不僅會(huì)反映在$o1中,也會(huì)反映到$o3中。其實(shí)我們之前專門有一篇文章就講的這個(gè)問(wèn)題,首先對(duì)象默認(rèn)賦值就是引用,其次這個(gè)例子很好地證明了引用就是一個(gè)符號(hào)表的綁定。刪除了快捷方式對(duì)原始對(duì)象和其他快捷方式?jīng)]有任何影響。大家可以參考:對(duì)象賦值在PHP中到底是不是引用?

 

引用的傳遞

關(guān)于引用在方法參數(shù)上的傳遞,最重要的是記住兩點(diǎn):一是方法內(nèi)部修改了變量外部也會(huì)變,這是引用的特性嘛;二是只能傳遞變量、New 語(yǔ)句、從函數(shù)中返回的引用三種類型。

error_reporting(E_ALL);
function foo(&$var)
{
    $var++;
    echo 'foo:', $var;
}
function bar() // Note the missing &
{
    $a = 5;
    return $a;
}
foo(bar()); // 自 PHP 5.0.5 起導(dǎo)致致命錯(cuò)誤,自 PHP 5.1.1 起導(dǎo)致嚴(yán)格模式錯(cuò)誤
            // 自 PHP 7.0 起導(dǎo)致 notice 信息,Notice: Only variables should be passed by reference
foo($a = 5); // 表達(dá)式,不是變量, Notice: Only variables should be passed by reference
// foo(5); // 導(dǎo)致致命錯(cuò)誤 !5是個(gè)常量!

///////////////////////////////
// 正確的傳遞類型
$a = 5;
foo($a); // 變量

function &baz()
{
    $a = 5;
    return $a;
}
foo(baz()); // 從函數(shù)中返回的引用

function foo1(&$var)
{
    print_r($var);
}
foo1(new stdClass()); // new 表達(dá)式
   

引用的返回

引用的返回并不是經(jīng)常使用的一個(gè)能力。文檔中的原文是:不要用返回引用來(lái)增加性能,引擎足夠聰明來(lái)自己進(jìn)行優(yōu)化。僅在有合理的技術(shù)原因時(shí)才返回引用!

$a = 1;
function &test(){
    global $a;
    return $a;
}

$b = &test($a);
$b = 2;
echo $a, PHP_EOL;
 

當(dāng)你想要返回一個(gè)引用變量的時(shí)候,一定要給方法定義和方法調(diào)用的時(shí)候都使用&符號(hào)。這個(gè)是需要注意的點(diǎn)。當(dāng)其他地方修改原本的變量值或者返回的變量值經(jīng)過(guò)修改后,都會(huì)影響到所有調(diào)用這個(gè)值的地方。所以說(shuō),引用的返回是比較危險(xiǎn)的,因?yàn)槟悴磺宄裁磿r(shí)候在什么地方這個(gè)值可能發(fā)生了修改,對(duì)于bug的排查會(huì)非常困難。

 

引用的取消

取消引用其實(shí)就是直接unset掉變量就可以了。但是一定要記住,PHP中的引用是指向的符號(hào)表,對(duì)原始真實(shí)的值是不起作用的,所以即使unset掉了最原始的那個(gè)變量,對(duì)其它引用賦值的變量也不會(huì)有影響!!

$a = 1;
$b = &$a;
$c = &$b;
$b = 2;
echo '定義引用后:', $a, '===', $b, '===', $c, PHP_EOL;

unset($b);
$b = 3;
echo '取消$b的引用,不影響$a、$c:', $a, '===', $b, '===', $c, PHP_EOL;

$b = &$a;
unset($a);
echo '取消$a,不影響$b、$c:', $a, '===', $b, '===', $c, PHP_EOL;

// 定義引用后:2===2===2
// 取消$b的引用:2===3===2
// 取消$a,不影響$c:===3===2


$a = 1;
$b = & $a;
$c = & $b; // $a, $b, $c reference the same content '1'

$a = NULL; // All variables $a, $b or $c are unset
echo '所有引用成空:', $a, '===', $b, '===', $c, PHP_EOL;
   

總結(jié)

這一次算是比較徹底的把引用說(shuō)了個(gè)透。關(guān)于PHP的引用只要記住了它的定義就非常好理解了,最直觀的就是當(dāng)成是操作系統(tǒng)的快捷方式就好了,并沒(méi)有我們想象中的那么難,和C的指針相比真的只是娃娃級(jí)別,多多練習(xí)多多復(fù)習(xí)自然就能很好地掌握使用啦!

測(cè)試代碼:https://github.com/zhangyue0503/dev-blog/blob/master/php/202002/source/%E5%BD%BB%E5%BA%95%E6%90%9E%E6%98%8E%E7%99%BDPHP%E7%9A%84%E4%B8%AD%E5%BC%95%E7%94%A8%E7%9A%84%E6%A6%82%E5%BF%B5.php

參考文檔:https://www.php.net/manual/zh/language.references.whatare.phphttps://www.php.net/manual/zh/language.references.whatdo.phphttps://www.php.net/manual/zh/language.references.arent.phphttps://www.php.net/manual/zh/language.references.pass.phphttps://www.php.net/manual/zh/language.references.return.phphttps://www.php.net/manual/zh/language.references.unset.phphttps://www.php.net/manual/zh/language.references.spot.php

到此,關(guān)于“PHP中引用的概念是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!


文章題目:PHP中引用的概念是什么
轉(zhuǎn)載注明:http://www.xueling.net.cn/article/jieocd.html

其他資訊

在線咨詢
服務(wù)熱線
服務(wù)熱線:028-86922220
TOP
主站蜘蛛池模板: 久久夜色精品国产亚洲 | 99精品国产自在现线10页 | 国产专区自拍 | 99情趣网 | 国产精品久久久久久久白浊 | 国产三级网站在线观看 | 97超碰人人草 | 亚洲一区二区在线看 | 亚州日本乱码一区二区三区 | 午夜青青草 | 免费观看一区二区 | 三年成全免费高清大全 | 国产成人免费无码AV在线播放 | 在线视频一区二区三区 | 久久精品国产曰本波多野结衣 | 日韩熟女精品一区二区三区 | 黄色一级小视频 | 久久黄色网 | 国产精品一区二区高清在线 | 伊人国产在线播放 | 小13箩利洗澡无码视频免费网站 | 国产精品345在线播放 | 披荆斩棘的哥哥第三季在线观看免费 | 午夜男女无遮掩免费视频 | 无码精品A∨在线观看十八禁 | 91在线观看入口 | 日韩二区三区四区 | 极品美女a诱v惑在线观看免费 | 波多野结衣连续高潮中出 | 天堂精品久久 | 亚洲人和日本人jzz视频 | 毛茸茸xxxxx 免费一级片视频 | 福利视频一二三在线视频免费观看 | 亚洲第一区在线 | 永久免费不卡在线观看黄网站 | 国产偷抇久久精品a片蜜臀a | 国产美女自慰在线观看 | 美州a亚洲一视本频v色道 | 亚洲一区日韩欧美 | 亚洲AV无码成人影片在线观看 | 国产亚洲自拍av |