站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        PHP的變量賦值你真的懂了?

        這個標(biāo)題估計很多人會不屑一顧,變量賦值?excuse me?我們學(xué)開發(fā)的第一課就會了好不好。但是,就是這樣基礎(chǔ)的東西,反而會讓很多人蒙圈,比如,值和引用的關(guān)系。今天,我們就來具體講講。

        首先,定義變量和賦值這個不用多說了吧

        $a = 1; $b = '2'; $c = [4, 5, 6]; $d = new stdClass();

        四個變量,分別定義了整型、字符串、數(shù)組的對象。這也是我們天天要打交道的四種類型。

        然后,變量給變量賦值。

        $a1 = $a; $b1 = $b; $c1 = $c; $d1 = $d;

        請注意,前三個的賦值都是正常的賦值,也就是對具體內(nèi)容的拷貝。當(dāng)我們修改$a1的時候$a不會有變化。$a1是新開的內(nèi)存空間保存了我們的值。也就是說,他們的值是一樣的,但內(nèi)存地址不一樣。是兩個沒啥關(guān)系的長得很像的人而已。

        但是$d1和$d就不是了,這兩貨不僅值是一樣的,內(nèi)存地址也是一樣的。這種情況就是我們所說的引用賦值。當(dāng)$d1發(fā)生變化時,$d2也會產(chǎn)生變化。

        可以這么說:引用賦值就是為原變量建立了一個Windows下的快捷方式或者Linux中的軟鏈接。

        用具體的例子來說明,首先是普通值的賦值:

        // 普通賦值 $v = '1'; $c = $v; $c = '2'; echo $v, PHP_EOL; // '1'  // 數(shù)組也是普通賦值 $arr1 = [1,2,3]; $arr2 = $arr1; $arr2[1] = 5; print_r($arr1); // [1, 2, 3]

        $c不會對$v的值產(chǎn)生影響。$arr2修改了下標(biāo)1,也就是第二個數(shù)字為5,當(dāng)然也不會對$arr1產(chǎn)生影響。

        那么對象形式的引用賦值呢?

        // 對象都是引用賦值 class A {     public $name = '我是A'; }  $a = new A(); $b = $a;  echo $a->name, PHP_EOL; // '我是A' echo $b->name, PHP_EOL; // '我是A'  $b->name = '我是B'; echo $a->name, PHP_EOL; // '我是B'

        果然不出所料,$b修改了name屬性的內(nèi)容后,$a里面的name也變成了$b所修改的內(nèi)容。

        在這種情況下,如果對象想要不是引用傳遞的,一是使用__clone(),也就是原型模式來進(jìn)行自己的拷貝。二是從外面重新new一個唄。

        // 使用克隆解決引用傳遞問題 class Child{     public $name = '我是A1的下級'; } class A1 {     public $name = '我是A';     public $child;      function __construct(){         $this->child = new Child();     }      function __clone(){         $this->name = $this->name;         // new 或者用Child的克隆都可以         // $this->child = new Child();         $this->child = clone $this->child;     } }  $a1 = new A1();  echo $a1->name, PHP_EOL; // 輸出a1原始的內(nèi)容 echo $a1->child->name, PHP_EOL;  $b1 = $a1; echo $b1->name, PHP_EOL; // b1現(xiàn)在也是a1的內(nèi)容 echo $b1->child->name, PHP_EOL;  $b1->name = '我是B1'; // b1修改內(nèi)容 $b1->child->name = '我是B1的下級'; echo $a1->name, PHP_EOL; // a1變成b1的內(nèi)容了 echo $a1->child->name, PHP_EOL;  // 使用__clone $b2 = clone $b1; // b2克隆b1 $b2->name = '我是B2'; // b2修改內(nèi)容 $b2->child->name = '我是B2的下級'; echo $b1->name, PHP_EOL; // b1不會變成b2修改的內(nèi)容 echo $b1->child->name, PHP_EOL; echo $b2->name, PHP_EOL; // b2修改的內(nèi)容沒問題,b1、b2不是一個貨了 echo $b2->child->name, PHP_EOL;

        對象的引用這一塊確實會容易讓人蒙圈。特別是更加復(fù)雜的對象,內(nèi)部的屬性還有各種引用其他對象的時候。這種情況下一定要仔細(xì)確認(rèn)引用賦值會不會帶來問題,如果有問題,就使用新對象或者克隆技術(shù)進(jìn)行引用問題的處理。

        最后,輕松一下,引用變量的賦值就和我們給方法傳引用參數(shù)一樣的,使用一個&符號就可以啦!

        // 引用賦值 $b = &$v; $b = '3'; echo $v, PHP_EOL;

        今天我們更深入的學(xué)習(xí)和了解了一下PHP中的賦值問題,特別是普通賦值和引用賦值的問題。下回看代碼和框架的時候可以注意注意別人是怎么靈活使用這兩種賦值的哈,自己也能試試能不能運(yùn)用這兩種方式改造下自己曾經(jīng)寫過的BUG哦!

        測試代碼: https://github.com/zhangyue0503/dev-blog/blob/master/php/201910/source/PHP%E7%9A%84%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC.php 參考文檔: https://www.php.net/manual/zh/language.variables.basics.php

        推薦學(xué)習(xí):《PHP視頻教程》

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 91精品国产品国语在线不卡| 久久久99精品成人片中文字幕 | 亚洲国产成人精品无码久久久久久综合| 久99久无码精品视频免费播放| 国产成人vr精品a视频| 无码国产亚洲日韩国精品视频一区二区三区| 国产日韩一区在线精品欧美玲| 亚洲国产一二三精品无码| 欧美精品黑人粗大| 国产精品无码久久久久| 国产vA免费精品高清在线观看| 国产精品亚洲片在线va| 精品国精品国产自在久国产应用| 99re这里只有精品6| 国产av无码专区亚洲国产精品| 99久久国产热无码精品免费| 久久精品亚洲中文字幕无码麻豆| 无码欧精品亚洲日韩一区夜夜嗨| 精品97国产免费人成视频| 99久久免费只有精品国产| 亚洲国产精品人久久| 91麻豆精品国产自产在线观看一区 | 四虎国产精品永久一区| 久久久九九有精品国产| 国产伦精品一区二区三区女 | 国产精品对白交换视频| 精品无码久久久久久午夜| 无码精品久久久久久人妻中字 | 亚洲午夜福利精品无码| 91精品视频网站| 999久久久免费精品国产| 久久99精品久久久久婷婷| 亚洲国产精品SSS在线观看AV| 亚洲Av无码精品色午夜 | 中文字幕精品一区| 一本色道久久88综合日韩精品| 欧美精品播放| 亚洲精品无码mv在线观看网站| 最新国产成人精品2024| 一本大道无码日韩精品影视| 亚洲AV永久纯肉无码精品动漫|