成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

PHP 引用的概念

瀏覽:123日期:2022-09-07 14:23:15
什么是引用?

在 PHP 中引用意味著用不同的名字訪問同一個變量內容。它不是C的指針,保存的并不是內存地址,無法進行指針運算。引用只是符號表的別名。就像 Unix 系統中的硬鏈接, Windows 系統中的快捷方式。

上面是官方手冊中的原文,怎么說呢,引用其實和我們印象中的C里面的指針并不是相同的概念。指針是針對真實內存的操作,引用是針對指向這個內存的符號表的操作。還是從操作系統的快捷方式來說,快捷方式是可以刪的,這就是PHP的引用。而C不僅刪了快捷方式,還把原文件也給刪了,這就是C的指針操作。

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

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

#include <stdio.h>#include <stdlib.h>int main(){ // C 中的指針和引用 int a = 1; int* b = &a; printf('%in', a); // 1 free(b); // free b printf('%in', a); //get error: *** error for object 0x7fff6350da08: pointer being freed was not allocated return 0;}

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

雖然說PHP的底層也是C寫得,但我們都知道C中的指針是出了名的變態,沒有一定的功底非常容易出錯。所以PHP的開發者沒有暴露C的原始指針能力,而是采用了和Java之類的類似的引用能力。這也是現代語言的特性,不需要我們過多的關注過于底層的能力,而將更多的時間放在業務實現上。

引用在數組和對象中的使用

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

$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'// }

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

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

不僅僅是數組,對象的引用也會有一些好玩的問題。

$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// NULLvar_dump($o3); // $o3不僅引用還存在,并且$a變成了’aaa’// object(stdClass)#1 (1) {// ['a']=>// string(3) 'aaa'// }

上面例子中有三個對象,o1、o1、o2、o3,其中,o3,其中,o2是對o1的引用,o1的引用,o3是直接賦值為o1。對o1。對o2屬性的操作不僅會反映在o1中,也會反映到o1中,也會反映到o3中。其實我們之前專門有一篇文章就講的這個問題,首先對象默認賦值就是引用,其次這個例子很好地證明了引用就是一個符號表的綁定。刪除了快捷方式對原始對象和其他快捷方式沒有任何影響。

引用的傳遞

關于引用在方法參數上的傳遞,最重要的是記住兩點:一是方法內部修改了變量外部也會變,這是引用的特性嘛;二是只能傳遞變量、New 語句、從函數中返回的引用三種類型。

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 起導致致命錯誤,自 PHP 5.1.1 起導致嚴格模式錯誤 // 自 PHP 7.0 起導致 notice 信息,Notice: Only variables should be passed by referencefoo($a = 5); // 表達式,不是變量, Notice: Only variables should be passed by reference// foo(5); // 導致致命錯誤 !5是個常量!///////////////////////////////// 正確的傳遞類型$a = 5;foo($a); // 變量function &baz(){ $a = 5; return $a;}foo(baz()); // 從函數中返回的引用function foo1(&$var){ print_r($var);}foo1(new stdClass()); // new 表達式引用的返回

引用的返回并不是經常使用的一個能力。文檔中的原文是:不要用返回引用來增加性能,引擎足夠聰明來自己進行優化。僅在有合理的技術原因時才返回引用!

$a = 1;function &test(){ global $a; return $a;}$b = &test($a);$b = 2;echo $a, PHP_EOL;

當你想要返回一個引用變量的時候,一定要給方法定義和方法調用的時候都使用&符號。這個是需要注意的點。當其他地方修改原本的變量值或者返回的變量值經過修改后,都會影響到所有調用這個值的地方。所以說,引用的返回是比較危險的,因為你不清楚什么時候在什么地方這個值可能發生了修改,對于bug的排查會非常困難。

引用的取消

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

$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 unsetecho ’所有引用成空:’, $a, ’===’, $b, ’===’, $c, PHP_EOL;總結

這一次算是比較徹底的把引用說了個透。關于PHP的引用只要記住了它的定義就非常好理解了,最直觀的就是當成是操作系統的快捷方式就好了,并沒有我們想象中的那么難,和C的指針相比真的只是娃娃級別,多多練習多多復習自然就能很好地掌握使用啦!

測試代碼: github.com/zhangyue050…

以上就是PHP的中引用的概念的詳細內容,更多關于PHP 引用的資料請關注好吧啦網其它相關文章!

標簽: PHP
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
一本久道久久综合中文字幕| 欧美高清视频在线高清观看mv色露露十八| 91麻豆视频网站| 午夜精品久久| 久久国产欧美| 欧美一卡二卡三卡| 亚洲欧美日韩电影| 久久99国产精品久久99果冻传媒| 国产东北露脸精品视频| 欧美日韩妖精视频| 色综合久久久久综合| 欧美一区二区高清| 亚洲精品国久久99热| 狠狠色丁香久久婷婷综合丁香| 欧美日韩精品久久| 欧美性猛交xxxx黑人交| 国产精品天美传媒沈樵| 日韩一区精品字幕| 欧美激情91| 一本一本久久a久久精品综合麻豆| 日韩欧美国产电影| 香蕉成人伊视频在线观看| 成人精品一区二区三区中文字幕| 影音先锋中文字幕一区二区| 欧美色网站导航| 综合欧美亚洲日本| 福利一区福利二区| 蜜桃av一区| 欧美激情一区二区三区不卡| 久久精品国产**网站演员| 国产综合自拍| 欧美猛男gaygay网站| 亚洲欧美经典视频| 成人av在线影院| 久久欧美肥婆一二区| 欧美激情在线一区二区三区| 激情成人综合网| 亚洲欧美bt| 国产精品卡一卡二| 国产精品自拍在线| 久久国产成人| 欧美国产欧美综合| 国产麻豆精品在线观看| 国产精品亚洲一区| 久久久久久久久久久电影| 蜜臀91精品一区二区三区| 影音先锋日韩资源| 精品国产一区二区三区四区四 | 国产精品一区二区在线观看网站| 亚洲激情国产| 国产亚洲精久久久久久| 国产一区亚洲一区| 久热精品视频| 亚洲精品国产第一综合99久久 | 欧美少妇一区| 精品国产免费视频| 精品综合久久久久久8888| 亚洲经典一区| 国产三级精品视频| 国产91精品精华液一区二区三区 | 麻豆一区二区在线| 一本色道久久综合亚洲精品不| 亚洲精品在线电影| 国产久卡久卡久卡久卡视频精品| 一本一本大道香蕉久在线精品| 日韩美女视频一区| 国产精品av久久久久久麻豆网| 欧美成人一区二区三区片免费| 免费人成精品欧美精品| 在线一区日本视频| 中文字幕高清不卡| 91网站最新地址| 欧美xingq一区二区| 国产在线一区观看| 在线欧美一区二区| 偷拍亚洲欧洲综合| 一本色道久久综合亚洲精品不卡| 国产精品色在线| 91老司机福利 在线| 久久视频一区二区| 成人免费观看av| 91精品免费观看| 韩国女主播一区| 欧洲一区在线观看| 丝袜美腿高跟呻吟高潮一区| 亚洲一区二区精品在线| 亚洲色图制服诱惑| 国产一区二区三区四区三区四 | 午夜精品久久久久久久久| 亚洲欧美不卡| 午夜亚洲国产au精品一区二区| 一区二区三区久久网| 亚洲欧美精品午睡沙发| 亚洲一本视频| 成人欧美一区二区三区在线播放| 欧美激情第六页| 国产欧美久久久精品影院| 色综合天天做天天爱| 久久免费视频一区| 国产99精品国产| 91精品国产综合久久福利软件| 久久99在线观看| 欧美伦理电影网| 国产高清在线观看免费不卡| 在线综合+亚洲+欧美中文字幕| 国内精品在线播放| 91精品国产麻豆| 福利电影一区二区| 精品久久五月天| 午夜日本精品| 欧美一区二区在线播放| 国产乱码字幕精品高清av| 欧美一卡二卡在线| av电影在线观看不卡| 久久精品人人做| 国产一区二区三区四区三区四| 亚洲同性同志一二三专区| 亚洲精品三级| 亚洲午夜久久久久久久久电影网 | 精品久久久久久久久久久久久久久久久 | 欧美99久久| 亚洲欧美日韩一区二区| 亚洲一区网站| 免费黄网站欧美| 欧美一区二区久久久| 99久久免费国产| 国产精品色眯眯| 国产麻豆综合| 日韩精品免费专区| 欧美日韩视频不卡| 菠萝蜜视频在线观看一区| 国产精品久久三| 麻豆亚洲精品| 国产一区二区三区电影在线观看| 精品嫩草影院久久| 欧美视频福利| 午夜精品一区在线观看| 欧美精品在线一区二区三区| av在线不卡观看免费观看| 中文字幕制服丝袜一区二区三区| 一区二区免费在线| 欧美性做爰猛烈叫床潮| caoporn国产一区二区| 亚洲欧洲日韩综合一区二区| 久久精品在线| 高清久久久久久| 中文字幕视频一区| 久久久久久国产精品一区| 国模娜娜一区二区三区| 久久久精品免费观看| 国产一区二区高清不卡| 国产九色精品成人porny| 中文字幕av一区二区三区| 久久久久久夜| 99精品欧美一区| 亚洲一区二区精品久久av| 在线综合亚洲欧美在线视频| 黄色国产精品| 青娱乐精品在线视频| 精品国产伦一区二区三区观看体验 | 成人激情小说网站| 夜夜亚洲天天久久| 67194成人在线观看| 91视频在线观看| 亚洲国产一区二区a毛片| 7777精品伊人久久久大香线蕉完整版 | 另类小说视频一区二区| 国产婷婷色一区二区三区| 久久天天狠狠| 成人精品电影在线观看| 一区二区三区免费网站| 欧美一区永久视频免费观看| 伊人久久婷婷色综合98网| 精品综合久久久久久8888| 国产精品久久久久四虎| 欧美体内she精视频| 国内精品久久国产| 九一久久久久久| 国产精品美女久久久久高潮| 欧美性极品少妇| 很黄很黄激情成人| 国产在线精品一区二区| 亚洲女人的天堂| 日韩欧美一二三| 久久激情一区| 欧美一区二区三区另类| 亚洲一二三四区不卡| 国产乱人伦偷精品视频不卡 | 亚洲欧美综合另类在线卡通| 欧美乱妇一区二区三区不卡视频| 亚洲人成毛片在线播放女女| 成人短视频下载| 国产欧美日韩三级| 在线播放一区二区三区| 午夜在线播放视频欧美| 麻豆精品视频在线观看免费| 麻豆精品蜜桃视频网站| 在线视频亚洲一区| 亚洲精品一区二区三区在线观看| 另类天堂av|