"新"的WordPress和"老"的PHP延展(Spread)運算符:寫在5.3發佈前

作為一款擁有了20年發展史,並佔據全球互聯網流量近34%的系統,WordPress核心的每次更改,都必須小心翼翼,因為這幾乎就意味著成千上萬的主題和插件,可能都會隨之而需要進行修正。也正因為此,WordPress的步伐開始變得越來越遲鈍,直到5.2,WordPress才放棄了對PHP 5.2 ~ 5.5的支持,這也意味著,其核心的開發團隊可以開始利用相對較新的PHP語法功能(其實很多也在5年之前就已支持),來提高整個核心的性能,並實現代碼的優化(包括代碼的可讀性)。

近日,WordPress正式向業界宣告了關於5.3版本WordPress的發佈計劃,其中,技術上最值得關注的點之一,則是他們對新的PHP數組延展運算符(Spread)的引入和使用。為了方便WordPress的開發者,尤其是很多因為僅在WordPress下開發,所以忽視了對PHP語言,在近些年來的發展情況進行跟蹤的開發者,可以更好的利用這一老的“新”技術,下面,對此來進行一個簡要的說明。

聲明 : WordPress 5.3中的更改,預計不會到影響主題和插件

除非在極少數情況下,這些主題和插件的開發者,重載了 wpdb::prepare() 方法。

PHP 5.6中的延展運算符(Spread)

從PHP 5.6開始,PHP引入了延展運算符,其基本上被使用在了兩個方面,即:

1、用於函數聲明中,可變參數部分的聲明

可變參數的函數,在PHP中存在多年了,在過去,開發人員通過使用func_get_args()func_get_arg()func_num_args() 等函數,在廣泛的使用著這一便捷的方式。

但是,也帶來了一個重大的問題,即:

如果不手動編寫詳細的說明文檔,函數的使用者,在不閱讀源代碼細節的情況下,根本不知道是否需要向這些函數傳遞參數,以及如何傳遞參數!

到了PHP 5.6中,開發人員則開始獲得了一種新的便利(這當然不是一個新東西,近年來,很多語言都先後腳的實現了這一功能),即可以在函數的聲明中,通過

...$var_name

的方式,來表示此處,該函數接受一個可變數量的參數。

比如,我們可以用這樣的方式,來聲明一個可傳入多個參數的乘法函數:

顯然的,對於使用延展運算符聲明的函數參數變量,在函數體內,可以視為是一個一般性的數組(Array)變量來處理,範例中 foreach 代碼部分展示了這一點。

調用的方式也很簡單,比如:

一看即明,在此就不贅述了。

2. 還可以反過來,通過延展運算符,直接將數組(Array)壓入到相關函數調用中

還是以乘法為例,假如說,我們現在已經定義了一個使用三個參數組成的函數,如下代碼所示:

一般情況下,調用該函數時,你需要手動向函數傳遞 x、x、x、y 和 $z 的參數值,

哪怕它們原來就已經存在在了某個數組中!

比如像這樣:

在PHP 5.6之前,我們需要將numbers[0]、numbers[0]、numbers[0]、numbers[1] 和 $numbers[2]分別作為函數的參數,傳遞到reserve_multiply中,而藉助於新的延展運算符,這一調用過程則得到了極大的簡化,代碼也變得整潔許多。

WordPress核心中的延展運算符

在瞭解了關於PHP 5.6後,關於延展運算符的一般使用原則後,下面,則不妨實際的來看下,WordPress在引入了這一運算符後,所實現的一些代碼改善。

以實際的核心函數 current_user_can() 為例,該函數的作用,是用來檢測當前的用戶是否有特定的權限,比如說,判斷當前登陸用戶,是否有權限可以編輯ID為123的帖子(Post),可以這樣來調用這個函數 :

而在WordPress 5.2及更早版本中,這一功能的實現代碼如下:

顯然的,為了確保該函數,在檢測某些權限時,比如上述的edit_post,允許傳入其他的參數,WordPress 5.2及其更早的版本,必須在其函數體內:

使用func_get_args()獲取所有參數,並將其中從第2個參數開始的內容(第1個參數對應的,實際上是$capability),重新切片組成新的,正確的$args數組!

這是非常侵入式且不雅緻的,充滿了各種“奇妙”的魔法,雖然它確實可以實現目標。

而到了WordPress 5.3,相同的功能,被簡化成:

與早期版本相比,藉助於延展運算符,新的current_user_can函數,不僅僅是對於其使用者更加“友好”了:起碼使用者,僅僅只需要藉助於函數本身的聲明,就可以很清楚的知道,這裡可以根據需要傳入 $args 參數。

更為重要的是,整個更改,在代碼可讀性上也獲得了極大的提高。看到WordPress團隊,能夠利用到這些新的PHP技術,來對核心代碼進行改進,應該說,我還是非常高興的。

也希望WordPress的開發者們,也能跟上這個快速的時代,畢竟,其實PHP 7.4,都即將正式發佈。

也再次感慨:很多時候,對於一個“古老”的系統來說,他的那些歷史沉澱,既是他的輝煌,也真的可能會成為他格格不入於新的時代、新的技術的最大羈絆!

祝WordPress好運。


分享到:


相關文章: