成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 為何說PHP引用是個坑,要慎用

為何說PHP引用是個坑,要慎用

熱門標簽:福建銀行智能外呼系統(tǒng)價格 電話機器人銷售主要負責什么 地圖標注專員怎么樣 寧波外呼營銷系統(tǒng) 長沙做地圖標注公司 四川保險智能外呼系統(tǒng)供應(yīng)商 上海做外呼線路的通信公司 遼寧ai電銷機器人價格 房產(chǎn)中介用的是什么外呼系統(tǒng)

前言

去年我參加了很多次會議,其中八次會議里我進行了相關(guān)發(fā)言,這其中我多次談到了 PHP 的引用問題,因為很多人對它的理解有所偏差。在深入討論這個問題之前,我們先回顧一下引用的基本概念,明確什么是“引用傳遞”。

在 PHP 中引用意味著用不同的名字訪問同一個變量內(nèi)容,不論你用哪個名字對變量做出了運算,其他名字訪問的內(nèi)容也將改變。

讓我們通過代碼來加深對此的理解。 首先我們寫幾個簡單的語句,把一個變量賦值給另一個變量,并且改變另一個變量:

?php
$a = 23;
$b = $a;
$b = 42;
var_dump($a); // int(23)
var_dump($b); // int(42)

這個腳本顯示 $a 值仍然為 23  ,而 $b 則等于 42 。出現(xiàn)這個情況的原因是我們得到的是一個拷貝(具體發(fā)生了什么稍后講解。。。)現(xiàn)在我們使用引用來做同樣的事情:

?php
$a = 23;
$b = $a;
$b = 42;
var_dump($a); // int(42)
var_dump($b); // int(42)
?>

現(xiàn)在 $a 的值也改變成了 42 。 事實上,$a 和 $b 之間沒有任何區(qū)別,它們都使用了同一個變量容器(又名: zval )。 將這兩者分開的唯一方法是使用 unset() 函數(shù)銷毀其中任何一個變量。

在 PHP 中,引用不僅能用在普通語句中,還能用于函數(shù)參數(shù)和返回值:

?php
function foo($param) {
 $param = 42;
 return $param;
}

$a = 23;
echo "\$a before calling foo(): $a\n";
$b = foo($a);
echo "\$a after the call to foo(): $a\n";
$b = 23;
echo "\$a after touching the returned variable: $a\n";
?>

你認為上面的結(jié)果是什么呢?—— 沒錯,就像下面這樣:

$a before calling foo(): 23
$a after the call to foo(): 42
$a after touching the returned variable: 42

這里我們初始化了一個變量,并把它作為一個引用參數(shù)傳給了一個函數(shù)。函數(shù)改變了它,它有了新值。該函數(shù)返回同一個變量,我們更改了返回的變量和它的原始值。。。 等等!它沒變,不是嗎??? —— 沒錯,可引用就是這樣。 具體發(fā)生了如下事情:該函數(shù)返回了一個引用,引用了 $a 的變量容器 zval,并且通過 = 賦值操作符為它創(chuàng)建了一個副本。

為了修復(fù)這個問題,我們需要添加一個額外的 操作符:

$b = foo($a);

結(jié)果和我們所期望的一樣:

$a before calling foo(): 23
$a after the call to foo(): 42
$a after touching the returned value: 23

總結(jié)一下: PHP 的引用就是同一個變量的別名,想要正確的使用它們可能很難。想要詳細了解引用計數(shù),這里有份基礎(chǔ)資料,請參閱 手冊中的引用計數(shù)基本知識 。

PHP 5 發(fā)布時最大的變動是『對象處理方式』。一般我們理解為:

在 PHP 4 中,對象被當成變量來對待,所以當對象作為函數(shù)傳參時,他們是被復(fù)制的。但在 PHP 5 中,他們永遠是『引用傳參』。

以上的理解并不完全正確。其主要目的是遵循『面對對象模式』:對象傳參給函數(shù)或者方法后,這個函數(shù)發(fā)送一個指令給對象(例如調(diào)用了一個方法)以此來改變對象的狀態(tài)(例如對象的屬性)。因此傳參進去的對象必須為同一個。 PHP 4 的面對對象用戶使用『引用傳參』來解決這個問題,不過很難做到完美。PHP 5 引進了獨立于變量容器的『對象存儲器』。當一個對象賦值給變量時,變量不再存儲整個對象(屬性表和其他的『類』信息),而是存儲這個對象所在 存儲器的引用 —— 當我們復(fù)制一個對象變量時,我們復(fù)制的是這個『存儲器的引用』。這很容易被誤解為『引用』,但是『存儲器的引用』與『引用』是完全不同的概念。下面的示例代碼有助于我們更好地區(qū)分:

?php
// 創(chuàng)建一個對象和此對象的引用變量
$a = new stdclass;
$b = $a;
$c = $a;

// 對『對象』進行操作
$a->foo = 42; 
var_dump($a->foo); // int(42)
var_dump($b->foo); // int(42)
var_dump($c->foo); // int(42)

// 現(xiàn)在直接改變變量的類型
$a = 42;
var_dump($a); // int(42)
var_dump($b); // object(stdClass)#1719 (1) {
    //   ["foo"]=>
    //   int(42)
    // }
var_dump($c); // int(42)
?>

以上代碼中,修改對象的屬性會影響到 復(fù)制 的變量 $b 和引用的變量 $c。但是在最后區(qū)塊的代碼中,當我們修改 $a 的類型時,引用的 $c 發(fā)生了變化,而復(fù)制得到的變量 $b 不會發(fā)生改變,這是個大多數(shù)有面對對象經(jīng)驗的工程師所期待的。

So, 面對對象是唯一使用『引用』的理由,但是現(xiàn)在 PHP 4 已死,你也可以放棄此類用法了。

另一個人們使用『引用』的理由是 —— 這將讓代碼更快。但是這是錯誤的,引用并不會使代碼執(zhí)行速度變快,更糟糕的是,很多時候『引用』會讓你的代碼執(zhí)行效率更低。

我必須再鄭重強調(diào)一次:是的,很多時候『引用』會讓你的代碼執(zhí)行效率更低。

別的語言的工程師,他們閱讀別的語言編碼規(guī)范,會看到建議在處理大的數(shù)據(jù)結(jié)構(gòu)或者字串時,使用指針來減小對內(nèi)存的消耗以提高運行效率。這些工程師誤將此概念理解到『引用』上,然而『指針』與『引用』是完全不同的技術(shù)模型。PHP 解析器與其他語言不同,在 PHP 中,我們使用『寫時復(fù)制(copy-on-write)』模型。

在『寫時復(fù)制』模型里,賦值和函數(shù)傳參不會觸發(fā) 復(fù)制 動作,你可以理解為多個不同的變量指向同一個『變量容器』,只有當『寫』動作發(fā)生時,才會觸發(fā)復(fù)制動作。這意味著,即使變量看起來像是『復(fù)制』的,本質(zhì)上卻不是。所以當傳參一個巨大的變量給某個函數(shù)時,并不會對性能造成多大影響。不過此時如果你使用引用傳參的話,引用傳參會關(guān)閉『寫時復(fù)制』機制,這會導(dǎo)致接下來那些沒有使用引用的變量傳參會被立刻復(fù)制一份。這也不是世界末日,你也可以在所有地方都引用就行了嘛。事實并非如此:PHP 的內(nèi)部機制依賴于『寫時復(fù)制』模型,存在很多你無法修改的內(nèi)部函數(shù)傳參。
我曾在某處看到過類似下面這樣的代碼:

?php
function foo($data) {
 for ($i = 0; $i  strlen($data); $i++) {
  do_something($data{$i});
 }
}

$string = "... looooong string with lots of data .....";
foo(string);
?>

顯然,上面這段代碼的第一個問題是:在循環(huán)中調(diào)用 strlen() 而不是使用已經(jīng)計算好的長度。也就是說調(diào)用一次 strlen($data) 就可以了的,但是他卻調(diào)用了很多次。 不同于 C 這類語言, 一般來說,PHP 的字符串都自帶了長度,因此也不用進行長度的計算。所以就 strlen() 而言,這還不算太糟糕。 但現(xiàn)在另一個問題是,案例中的這個開發(fā)者為了節(jié)省時間,傳遞了一個引用作為參數(shù)以顯示自己的聰明。 然而,strlen() 期望得到的是一個副本?!簩憰r復(fù)制』不能用于引用,因此 $data 將會在 strlen() 調(diào)用時被復(fù)制,strlen() 將會做一個絕對簡單的操作 —— 事實上 strlen() 本來就是 PHP 里最簡單的函數(shù)之一 —— 緊接著該副本就會被直接銷毀。

如果沒有使用引用,也就沒必要進行復(fù)制操作,代碼執(zhí)行也會更快。而且就算 strlen() 支持引用,你也不會因此獲得更多好處。

總的來說:

  • 除了 PHP4 的遺留問題,不要在面向?qū)ο螅∣O)中使用引用。
  • 不要使用引用來提升性能。

使用引用來完成事情的第三個問題是:通過參數(shù)的引用來返回數(shù)據(jù)所導(dǎo)致的糟糕的 API 設(shè)計。這個問題還是因為那個開發(fā)者沒有意識到『PHP 就是 PHP 而不是其他語言』所導(dǎo)致的。

在 PHP 中,同一個函數(shù)可以返回不同數(shù)據(jù)類型?!?因此,你可以在函數(shù)執(zhí)行成功時返回一個字符串,而在失敗時返回一個布爾值 false,PHP 也允許返回復(fù)雜的結(jié)構(gòu)類型,比如數(shù)組和對象。所以在需要返回很多東西的時候,可以將他們打包在一起。另外,異常也是函數(shù)返回的一種方式。

使用引用是一件不好的事情,除了引用本身不好,并且還會使性能下降這個事實外,使用引用這種方式會使得代碼難以維護。像下面這段代碼的函數(shù)調(diào)用:

do_something($var);

你希望 $var 發(fā)生改變嗎?—— 當然不會。然而,如果 do_something() 傳遞的參數(shù)是引用,它就可能會改變。

這類 API 的另一個問題是:函數(shù)不能鏈式調(diào)用,因而你總會遇到必須使用臨時變量的場景。鏈式調(diào)用可能會使可讀性降低,但是在許多場景下,鏈式調(diào)用使得代碼更加簡潔。

關(guān)于引用的糟糕的設(shè)計決定,我個人最喜歡的一個例子是 PHP 自帶的 sort() 函數(shù)。sort() 使用一個數(shù)組作為引用參數(shù),然后通過引用返回一個排好序的數(shù)組。 像常規(guī)那樣通過值返回一個排好序的數(shù)組可能還更好些。當然,這么做是由于歷史的原因:sort() 比『寫時復(fù)制』更早出現(xiàn)?!簩憰r復(fù)制』產(chǎn)生于 PHP4,而 sort() 則更早,它早在 PHP 還是作為一種在 Web 上做起事來很方便的東西,而不是真正的成為自己的語言的時候就存在了。

總之: 在 PHP 中,引用是不好的。 不要使用引用。 它們只會惹事生非,另外,不要對使用引用來提升引擎抱有希望。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • php 傳值賦值與引用賦值的區(qū)別
  • php 引用()詳解
  • PHP中函數(shù)內(nèi)引用全局變量的方法
  • PHP引用(&)各種使用方法實例詳解
  • PHP 引用文件技巧
  • PHP正則表達式的逆向引用與子模式分析
  • php中引用符號()的使用詳解
  • php引用傳值實例詳解學(xué)習(xí)
  • PHP的引用詳解

標簽:佛山 宜春 澳門 常德 深圳 延安 工商登記 宿遷

巨人網(wǎng)絡(luò)通訊聲明:本文標題《為何說PHP引用是個坑,要慎用》,本文關(guān)鍵詞  為何,說,PHP,引用,是個,坑,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《為何說PHP引用是個坑,要慎用》相關(guān)的同類信息!
  • 本頁收集關(guān)于為何說PHP引用是個坑,要慎用的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美亚洲高清一区二区三区不卡| 欧美日韩一区二区三区高清| 欧美另类高清videos的特点| 免费观看性欧美大片无片| 翁止熄痒禁伦短文合集免费视频| 日韩一级av毛片| 欧美mv和日韩mv国产网站| 超碰在线免费看| 麻豆最新免费在线视频| 美女主播视频一区| 午夜视频一区二区在线观看| 欧美3p在线观看| 天天操中文字幕| 国产精品视频一区在线观看| 中文字幕在线影视资源| 综合网日日天干夜夜久久| 国产日韩精品一区二区浪潮av| 在线视频日韩精品| 熟女少妇精品一区二区| 变态另类丨国产精品| 亚洲人成精品久久久久久| 日韩av大片在线| 天干夜天天夜天干天ww| 91一区在线| 国产精品二线| 4438全国亚洲精品在线观看视频| 国产乱叫456在线| 日韩欧美国产系列| 亚洲男人都懂的网站| 精品国精品自拍自在线| 欧美精品一区二区三区久久久竹菊| 欧美大肚乱孕交hd孕妇| 视频一区亚洲| 91传媒在线观看| 欧美激情亚洲激情| 日本一区二区三区四区五区| 91青青草免费观看| 亚洲妇女成熟| 免费看大片爽| 欧美婷婷久久| 草草草视频在线观看| 欧美性猛交xxx高清大费中文| 亚洲成人看片| 天天操天天搞| 99热成人精品热久久66| 日韩中文不卡| 一色屋色费精品视频在线看| 一本色道久久亚洲综合精品蜜桃| 亚洲自拍第三页| 国产一区二区三区黄片| 亚洲最大成人免费视频| 免费不卡中文字幕视频| 人妻互换免费中文字幕| 免费看欧美一级片| 国精产品一区一区三区视频| 色综合666| 国产又黄又粗又猛又爽的视频| 欧美精品久久久久久久自慰| 欧美日韩午夜电影网| 国产欧美日韩小视频| 中文字幕一区二区三区四区在线视频| 五月天激情国产综合婷婷婷| 免费成人在线观看视频| 毛片在线播放网站| 97精品在线视频| 哺乳挤奶一区二区三区免费看| 中文字幕求饶的少妇| 久久99国产精品免费| 美国精品一区二区| 伊人一区二区三区久久精品| 俺也去精品视频在线观看| 在线观看日本视频| 99这里只有精品| 91精品久久久久久久蜜月| 亚洲国产欧美另类丝袜| 天堂网成人在线| 国产精品久久久久久免费观看| 日本久久久久久久久久久久| 成人久久网站| 在线午夜视频| 各处沟厕大尺度偷拍女厕嘘嘘| 日韩一区二区三区在线视频| 加勒比一区二区三区| 热久久这里只有| 国产在线黄色| 天涯成人国产亚洲精品一区av| 中文字幕永久在线观看| 免费在线观看av片| 羞羞网站在线看| 国产免费观看久久黄| 亚洲午夜国产成人| 国产一级视频在线播放| 美腿丝袜亚洲综合| 人人精品久久| 精品视频在线观看网站| 91手机视频在线| 91久久大香伊蕉在人线| 狠狠v欧美v日韩v亚洲ⅴ| 国产又爽又黄网站亚洲视频123| 熟妇人妻无乱码中文字幕真矢织江| 亚洲丁香日韩| 国产乱码午夜在线视频| 国自产拍偷拍福利精品免费一| 中国人与牲禽动交精品| 亚洲午夜无码av毛片久久| 户外极限露出调教在线视频| 国产在线精选视频| 欧美在线观看视频一区二区三区| 国产精品一级在线观看| 91九色porny在线| 国产成人精品亚洲线观看| 极品美乳网红视频免费在线观看| 日韩一区二区三区免费看| 久一视频在线观看| 欧美在线综合| 成品网站w灬+源码1| 久久久精品电影| 亚洲综合最新在线| 久久成人精品电影| 国产精品―色哟哟| 欧美精品丝袜中出| 亚洲欧美成人精品| 精品久久久久久久久久久久久久久| 精品国产乱码久久久久久影片| 欧美最猛黑人猛交69| 污污视频在线免费观看| 日韩日韩日韩日韩| 欧美最猛性xxxx高清| 日皮视频在线观看| 老司机凹凸av亚洲导航| 久久久久久久久99| 国产系列精品av| 国产精品久久精品视| 狠狠色狠狠色综合网| 天天影视色香欲综合网老头| 外卖gayxxxxgay1| 欧美日韩视频在线一区二区观看视频| 一区二区三区鲁丝不卡| 久久精品人人| 国产精品一二二区| 91av.cn| 污污视频网站免费观看| 裸模一区二区三区免费| 三妻四妾完整版在线观看电视剧| 伊人成综合网伊人222| 日本二区在线观看| 国产精品亚洲综合在线观看| 少妇高潮在线观看| 在线播放中文一区| 国产中文字幕日韩| 国产69精品久久| 国产青草视频在线观看视频| 欧美性大战久久久久久久蜜臀| 99久久er| 成人欧美视频在线| 日韩国产高清一区| 久久伊人资源站| 精品欧美激情精品一区| 日本一级大毛片a一| 在线观看视频免费一区二区三区| 亚洲成人基地| 91精品国产电影| 色网在线播放| 国产一区二区三区不卡在线| 国产精品视频专区| 亚洲欧洲视频| 成年网站在线看| 六月婷婷在线视频| 宅男噜噜噜66国产日韩在线观看| 婷婷亚洲一区二区三区| 欧美波霸videosex极品| 日韩成人小视频| 亚洲成av人片一区二区密柚| 99久久久久免费精品国产| 成年女人a毛片免费视频| 少妇与大狼拘作爱性a| 99爱在线观看| 91伊人久久大香线蕉| 丰满少妇大力进入| 国产欧美一区二区精品忘忧草| 四虎成人在线播放| 成人性生活视频免费看| 黄色av一区二区三区| 最新不卡av| 超碰手机在线观看| 亚洲你懂的在线视频| 色妞在线综合亚洲欧美| 亚洲四色影视在线观看| 中文精品电影| 你懂得网站在线| 多人欧美交性姿势| 日本在线一区二区三区| 香蕉精品999视频一区二区| heisi视频网在线观看| 色综合咪咪久久| 久久久久久香蕉| 日韩日韩日韩日韩日韩| 在线播放中文一区| 日韩精品久久一区二区三区| 日韩精品999| 99久久一区二区| 国产精品久久国产精麻豆96堂| 国产三级自拍| 国产精品福利小视频| 91动漫在线| 婷婷综合网站| 污污的网站在线免费观看| 欧美最大成人综合网| 人狥杂交一区欧美二区| 精品一区二区三区免费| 伊人网av在线| 久久久久久97三级| 国产河南妇女毛片精品久久久| 男人的天堂视频在线| 国产精品国产三级国产有无不卡| 亚洲欧美日韩国产成人| 国产精品毛片久久| 国产剧情一区| 偷拍日韩校园综合在线| 日韩精品一区二区不卡| 米仓穗香在线观看| 精品国产视频在线观看| 久久婷婷人人澡人人喊人人爽| 亚洲第一色网站| 国产精品欧美一区二区三区| 日本不卡一区二区三区视频| 牛牛热在线视频| 欧美激情偷拍自拍| 一本到不卡免费一区二区| 国产精品国产三级国产aⅴ无密码| 伊人影院在线播放| 99精品欧美一区二区三区小说| 亚洲av午夜精品一区二区三区| 国产一区二区三区免费观看在线| 中文字幕一区二区人妻电影| 波多野结衣50连登视频| 日韩黄色在线| 99re6热只有精品免费观看| 中文字幕网址在线| 免费在线观看黄| 亚洲无线看天堂av| 午夜精品999| 婷婷另类小说| 26uuu亚洲婷婷狠狠天堂| 丁香网亚洲国际| 中文字幕日韩一级| 黄页视频在线观看| 亚洲黄色片在线观看| 色综合视频一区二区三区44| 91豆花精品一区| free性亚洲| 99久久精品免费看国产免费软件| 欧美一区二区黄片| 激情av综合网| 亚洲国产精品久久久| 国产亚洲污的网站| 亚洲精品www久久久久久广东| 国产精品456| 欧美日韩精品免费观看视欧美高清免费大片| sihu影院永久在线影院| 欧美午夜一区二区三区免费大片| 久久天堂电影网| 色综合久久久久网| 久久伊人久久| 欧美亚洲高清一区二区三区不卡| 日韩美女一区| 欧美三区免费完整视频在线观看| 神马影院午夜我不卡| 日本高清精品| 一区二区三区韩国免费中文网站| 在线欧美视频| 亚洲欧美另类在线| 日韩在线精品| 意大利激情丛林无删减版dvd| 国产在线视频自拍| 尤物精品在线| 欧美三级伦理在线| 欧美亚洲高清一区| h色视频在线观看| 免费在线观看91| 欧美理论电影在线观看| 91国在线产| 国产亚洲欧美日韩美女| 亚洲天堂1区| 麻豆av在线播放| 国产一区二区在线观看免费| 午夜av在线免费观看| 四虎成人影院网址| 精品亚洲免a| 亚洲男人天堂久久| 成人免费视频97| 国产亚洲精品久久飘花| 91精品久久久久久久蜜月| 国产精品毛片aⅴ一区二区三区| 亚洲永久网站| 久久久女人电视剧免费播放下载| 暖暖视频在线免费观看| 不用播放器的免费av| 精品一区二区三区视频在线播放| 国产一区二区视频免费在线观看| 欧美日韩精品一区二区| 亚洲成人资源| 欧美mv和日韩mv国产网站| 女人18毛片水真多18精品| 国产日本欧美在线观看| 国产精品色婷婷视频| 欧美深夜福利| 国产精品三级av| 亚洲精品国产成人av在线| 五月婷婷丁香激情| 亚洲天堂一二三| 在线视频亚洲色图| 二级片在线观看| 色网站在线免费观看| 高清视频在线观看三级| 欧美一区二区三区视频免费播放| 欧美日韩一区二区三区四区不卡| 色综合久久综合网97色综合| 久久久久久久久99| 成人午夜激情免费视频| av在线播放中文字幕| xxxxxhd亚洲人hd| 欧美成免费一区二区视频| 国产精品538一区二区在线| 亚洲成年人专区| 91老司机在线| 久久久久久久久久久久久久久久久久| 久久久久免费av|