之前說過引用(REFERENCE)在PHP5的時候是一個標誌位, 而在PHP7以後我們把它變成了一種新的類型:IS_REFERNCE. 然而引用是一種很常見的應用, 所以這個變化帶來了很多的變化, 也給我們在做PHP7開發的時候, 因為有的時候疏忽忘了處理這個類型, 而帶來不少的bug.
最簡單的情況, 就是在處理各種類型的時候, 從此以後我們要多考慮這種新的類型, 比如在PHP7中, 這樣的代碼形式就變得很常見了:
try_again: swtich (Z_TYPE_P(zv)) { case IS_TRING: break; case IS_ARRAY: break; ... case IS_REFERENCE: zv = Z_REFVAL_P(zv); //解引用 goto try_again; break; }
如果大家自己寫的擴充, 如果忘了考慮這種新的類型, 那麼就會導致問題.
為什麼?
##那麼既然這種新類型會帶來這麼多問題, 那麼當時為什麼要用把引用變成一種類型呢? 為什麼不還是使用一個標誌位呢?一句話來說, 就是我們不得不這麼做. -_#前面說到, Hashtable直接儲存的是zval, 這樣在符號表中, 兩個zval如何共用一個數值呢? 對於字串等複雜型別來說還好, 我們貌似可以在zend_refcounted結構中加入一個標誌位來表明是引用來解決, 然而這個也會遇到Change On Write帶來的複製, 但是我們知道在PHP7中, 一些類型是直接存儲在zval中的, 比如IS_LONG, 但是引用類型是需要引用計數的, 那麼對於一個是IS_LONG並且又是IS_REFERNCE的zval該如何表示呢?為此, 我們創造了這個新的類型:Change On Write
PHP採用引用數來做簡單的垃圾回收, 考慮如下的程式碼:<?php 1. $val = "laruence"; 2. $ref = &$val; 3. $copy = $val; ?>$ref和$val是指向同一個zval的引用, 在PHP5的時候, 我們是透過一個引用計數為2, 並且引用標誌位為1來表示這種情況, 當把$val複製給$copy(line 3)的時候, 我們發現$val是一個計數大於1的引用, 所以要產生Change on write, 也就是分離. 所以我們需要複製這個zval.而在PHP7中, 情況就變得簡單了很多, 首先在引用賦值給$ref(line 2)的時候, 產生一個IS_REFERNCE類型, 然後因為此時有兩個變數引用它所以zend_reference這個結構的引用計數zval.value.ref->gc. refcount為2.再隨後的賦值給$copy(line 3)的時候, 發現$val是一個引用, 於是讓$copy指向的是zval.value.ref->val, 也就是字串值為laruence的zval, 然後把zval的引用計數1, 也就是zval.value.ref->val.value.str.gc.refcount為2. 並沒有產生複製.從而這就很好的解決了上一章所說的PHP5的那個經典的問題, 比如我們在PHP7下運行上一章的那個問題, 我們得到的結果是:
$ php-7.0/sapi/cli/php /tmp/1.php Used 0.00021380008539 Used 0.00020173048281可見確實沒有發生複製, 從而不會產生任何的性能問題.推薦:《
PHP教程》
以上是深入理解PHP7內核之Reference的詳細內容。更多資訊請關注PHP中文網其他相關文章!

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

你應該關心DependencyInjection(DI),因為它能讓你的代碼更清晰、更易維護。 1)DI通過解耦類,使其更模塊化,2)提高了測試的便捷性和代碼的靈活性,3)使用DI容器可以管理複雜的依賴關係,但要注意性能影響和循環依賴問題,4)最佳實踐是依賴於抽象接口,實現鬆散耦合。

是的,優化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)優化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,並避免使用

theKeyStrategiestosigantificallyBoostPhpaPplicationPerformenCeare:1)UseOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)優化AtabaseInteractionswithPreparedStateTementStatementStatementAndProperIndexing,3)配置

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增強codemodocultion,可驗證性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

選擇DependencyInjection(DI)用於大型應用,ServiceLocator適合小型項目或原型。 1)DI通過構造函數注入依賴,提高代碼的測試性和模塊化。 2)ServiceLocator通過中心註冊獲取服務,方便但可能導致代碼耦合度增加。

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)啟用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替換loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

phpemailvalidation invoLvesthreesteps:1)格式化進行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

記事本++7.3.1
好用且免費的程式碼編輯器

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!