婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PHP 引用的概念

PHP 引用的概念

熱門標簽:地圖標注平臺怎么給錢注冊 釘釘打卡地圖標注 安裝電銷外呼系統 常州地圖標注服務商 福州人工外呼系統哪家強 注冊400電話申請 新河科技智能外呼系統怎么樣 百度商鋪地圖標注 衡水外呼系統平臺

什么是引用?

在 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("%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變量就直接報錯了。

雖然說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
// NULL

var_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 reference
foo($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 unset
echo '所有引用成空:', $a, '===', $b, '===', $c, PHP_EOL;

總結

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

測試代碼: github.com/zhangyue050…

以上就是PHP的中引用的概念的詳細內容,更多關于PHP 引用的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • 詳解PHP的引用計數
  • php的對象傳值與引用傳值代碼實例講解
  • php傳值和傳引用的區別點總結
  • php 多個變量指向同一個引用($b = &$a)用法分析
  • php引用和拷貝的區別知識點總結
  • php中對象引用和復制實例分析
  • PHP實現無限極分類的兩種方式示例【遞歸和引用方式】
  • PHP中引用類型和值類型功能與用法示例
  • PHP 弱引用的相關總結

標簽:柳州 克拉瑪依 六安 遼陽 鷹潭 唐山 白城 鶴崗

巨人網絡通訊聲明:本文標題《PHP 引用的概念》,本文關鍵詞  PHP,引,用的,概念,PHP,引,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP 引用的概念》相關的同類信息!
  • 本頁收集關于PHP 引用的概念的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲精品在线三区| 亚洲女人的天堂| 欧美视频一区二| 99精品热视频| 色综合久久综合网97色综合| 99久久精品免费看| 色老头久久综合| 欧美日韩国产色站一区二区三区| 欧洲激情一区二区| 欧美日韩亚州综合| 欧美一级欧美一级在线播放| 精品国产露脸精彩对白| 久久新电视剧免费观看| 国产精品久久久久久久久果冻传媒 | 日本大胆欧美人术艺术动态| 免费黄网站欧美| 国产成人在线视频网址| 不卡的电视剧免费网站有什么| 99视频精品在线| 欧美久久久一区| 日本一道高清亚洲日美韩| 欧美天堂一区二区三区| 这里是久久伊人| 精品欧美乱码久久久久久| 国产日韩精品久久久| 中文字幕一区二区三区不卡在线| 一区二区三区免费看视频| 日本免费在线视频不卡一不卡二| 精品在线播放免费| 一本大道av伊人久久综合| 欧美日韩中文国产| 久久婷婷色综合| 亚洲国产精品久久艾草纯爱| 国产专区欧美精品| 色狠狠色噜噜噜综合网| 日韩精品一区二区三区在线观看| 国产精品毛片大码女人| 日韩av电影天堂| av一区二区三区| 欧美成人r级一区二区三区| 中文字幕精品一区二区三区精品 | 99精品国产99久久久久久白柏| 在线免费观看不卡av| 2020国产精品自拍| 亚洲成av人片一区二区梦乃| 国产在线精品一区二区三区不卡| 欧美日韩一卡二卡三卡| 国产精品日产欧美久久久久| 久久精品免费观看| 欧美性大战久久久| 中文字幕亚洲综合久久菠萝蜜| 老汉av免费一区二区三区| 91黄色在线观看| 亚洲日韩欧美一区二区在线| 国产另类ts人妖一区二区| 欧美精品欧美精品系列| 一区二区欧美在线观看| 岛国av在线一区| 26uuu精品一区二区| 青娱乐精品视频| 欧美日韩高清一区二区三区| 亚洲欧美激情小说另类| 不卡的av中国片| 中文字幕在线观看不卡视频| 国产成人av电影在线| 26uuu精品一区二区三区四区在线| 青青草原综合久久大伊人精品优势| 欧美在线一区二区三区| 亚洲国产精品久久一线不卡| 欧美在线观看禁18| 亚洲va在线va天堂| 在线播放中文一区| 日日骚欧美日韩| 欧美一级日韩不卡播放免费| 麻豆一区二区三区| 日韩欧美国产三级| 亚洲欧美日韩综合aⅴ视频| 成人爽a毛片一区二区免费| 日韩一区二区精品在线观看| 亚洲观看高清完整版在线观看 | 欧美一区二区大片| 日韩中文字幕区一区有砖一区 | 色哟哟在线观看一区二区三区| 国产欧美一区二区三区在线看蜜臀| 经典三级视频一区| 欧美激情一区二区三区不卡 | 91视频一区二区三区| |精品福利一区二区三区| 91浏览器在线视频| 午夜精品福利一区二区蜜股av| 91精品国产综合久久香蕉的特点 | 日韩一区二区视频| 国产呦精品一区二区三区网站| 久久久久久电影| 99re热视频精品| 日韩成人一区二区三区在线观看| 日韩欧美一区二区三区在线| 国产成人av资源| 亚洲午夜激情网页| 精品国产网站在线观看| av电影在线观看完整版一区二区| 亚洲靠逼com| 精品成a人在线观看| 99精品久久久久久| 日韩精品一级二级 | 欧亚一区二区三区| 久久国产视频网| 樱桃视频在线观看一区| 欧美变态凌虐bdsm| 色综合久久九月婷婷色综合| 日韩国产精品久久| 亚洲视频一区在线| 欧美mv日韩mv国产网站app| 91污在线观看| 国产成人av电影| 亚洲成人一二三| 国产精品美女久久久久久久久| 51久久夜色精品国产麻豆| 国产成人亚洲综合a∨猫咪| 天天综合网天天综合色| 懂色av中文一区二区三区| 中文字幕中文字幕中文字幕亚洲无线| 91成人在线精品| 高清国产一区二区| 另类成人小视频在线| 夜夜嗨av一区二区三区中文字幕| 久久综合色播五月| 91精品欧美久久久久久动漫| a美女胸又www黄视频久久| 久久99国产精品久久99| 午夜欧美一区二区三区在线播放| 国产日本一区二区| 久久亚洲综合色一区二区三区| 欧美日韩国产小视频| 色视频欧美一区二区三区| 不卡的av在线| 成人在线一区二区三区| 国产乱国产乱300精品| 精品系列免费在线观看| 久久精品噜噜噜成人av农村| 午夜精品在线看| 午夜精品成人在线| 日韩成人av影视| 日韩电影在线观看电影| 日韩国产欧美在线视频| 石原莉奈一区二区三区在线观看| 亚洲国产美女搞黄色| 亚洲福利一二三区| 视频一区二区不卡| 美女视频网站久久| 久久激情五月婷婷| 国内一区二区视频| 国产麻豆9l精品三级站| 国产超碰在线一区| 99久久99久久精品免费看蜜桃| 成人一道本在线| 色婷婷久久99综合精品jk白丝| 99国产精品国产精品久久| 91视频在线观看免费| 欧美亚洲免费在线一区| 4438x亚洲最大成人网| 精品国产一区久久| 国产精品丝袜91| 亚洲一区二区三区自拍| 奇米影视7777精品一区二区| 国产真实乱子伦精品视频| 成人av在线一区二区| 欧美影院一区二区三区| 欧美一卡二卡在线观看| 久久久综合精品| 亚洲男人都懂的| 蜜臀av一区二区三区| 国产成人在线电影| 精品视频1区2区3区| 欧美成人一区二区三区| 国产精品久久久久毛片软件| 亚洲综合图片区| 国产一区美女在线| 在线免费不卡视频| 国产亚洲欧美在线| 亚洲国产精品久久人人爱蜜臀| 极品少妇一区二区| 色综合色综合色综合色综合色综合| 欧美日韩日本视频| 久久久99久久| 天天综合网 天天综合色| 岛国av在线一区| 日韩美女主播在线视频一区二区三区| 欧美激情一区二区在线| 日本欧美一区二区在线观看| av男人天堂一区| 国产日韩亚洲欧美综合| 国产精品国产三级国产有无不卡| 一区二区在线观看视频| 国内外成人在线| 欧美视频一区二区三区在线观看 | 欧美图片一区二区三区| 国产色91在线| 免费久久99精品国产| 欧美三级欧美一级|