問題描述
使我的外掛可擴充套件是解決大多數人的問題的下一個方法。而且我知道我可以在這裡和那裡放置大量的過濾器和動作鉤,使事情更加動態。但對我來說,這太亂了
最近我的外掛的使用者要求更改工具提示文字,在他們的情況下,這不是很糟糕的原因。該頁面上有 6-8 個工具提示。我知道我可以為每個 「em」 放置過濾鉤。但我應該嗎
有沒有任何缺點,關於放置許多鉤子的效能問題?
最佳解決辦法
只要鉤子沒有掛鉤的東西就是 no-ops,這幾乎沒有任何東西,對執行時沒有什麼影響。當事情掛鉤,有很多電話時,它會有很大的不同。
由於您談到自定義字串,好的例子是 gettext 掛鉤核心。本地化的每個字串透過它。
所以在理論上這是一個非常靈活的鉤子,允許在幾乎任何地方過濾文字。在實踐中,它可以發射數千次,如果你毫無保留地鉤住它,它會快速減慢複雜的網站停止。
您沒有充分詳細介紹您的用例以推薦具體實現。一般來說,您有多種選擇可以組織起來:
-
apply_filters( 'prefix_tooltip', $text )是基本的情況,過濾器必須弄清楚文字是否正確匹配以確定上下文,從而變得脆弱。 -
apply_filters( 'prefix_tooltip', $text, 'type/location' )附加引數允許您指定工具提示的型別,哪個過濾器可以定位; 所以即使文字發生變化,該型別仍然標識它。 -
apply_filters( 'prefix_tooltip_' . $type, $text )動態掛鉤名稱,其變化為變數值; 這對於許多/生成的型別的情況非常靈活,主要的問題是動態鉤子在程式碼中難以發現,在 self-documenting 中更糟糕; -
apply_filters( 'prefix_tooltips', $texts_array )單個過濾器,用於完整的工具提示。
在 6-8 個條目的計數中,這些之間的效能差異將不會很明顯。
您在這裡學習的重要內容是什麼方法,您需要仔細挑選最適合每一種情況,為自己和下游開發人員提供有意義和便利的資訊。
次佳解決辦法
這裡真的有兩個問題 1. 有鉤的影響是什麼?你應該在任何地方傳播鉤子
-
影響接近零。如果在動作/過濾器上沒有任何東西掛鉤,對
do_action/apply_filters的呼叫將幾乎以 imidiatly 返回,所以對不使用掛鉤的人不會有任何明顯的影響,因此新增它們在技術上是不好的 (如果你給任何半合理的理由新增鉤子到核心,它很有可能被核心主題新增) 。 -
但它是否作為軟體開發實踐的智慧?不,Hooks 是 API 和 API,意味著您的長期承諾,以維護它們。因此,您建立的任何”official” API,您應該認為這是長期的外掛有用的東西,而不是僅僅讓一個外掛使用者開心。
從您的描述,如果您認為有需要定製的文字,也許您應該考慮使用某種設定螢幕。這顯然也是某種 API,但終端使用者更易於訪問。
第三種解決辦法
定製化總是絆腳石 (痛苦的過程) 。從一方面,我們有一個真正的請求 (問題) 從使用者總是重要的。另一方面,所有這些附加選項可以將您可愛的主題,外掛或一些抽象的產品轉移到地獄。那麼我們可以做什麼作為開發人員?
首先。使用機會編寫可擴充套件程式碼來更改程式碼的一些程式碼 – 可重用程式碼。類,介面,特徵,並將 long-wrong 程式碼分解成小的方法 (函式) 。部分使用者可以輕鬆使用它們,而不會改變您的產品。例如,有人可以根據自己的需要建立一個小工具,並使用內部外掛函式 please_echo_the_plugin_awesome_stuff()。
新增新的過濾器和操作是不錯的主意。許多流行的外掛,如 Jetpack 或 bbPress 在其程式碼中有數百個過濾器。有時甚至過分。沒有任何處理程序的每個新的過濾器 (或動作) 通常不會做很大的開銷。這是一個微秒
10^-3 秒毫秒 ms 10^-6 s 微秒μs
透過 add_action()或 add_filter()新增新的處理程序,更重要的是您正在做的這個操作。例如,向資料庫伺服器的請求 (有時候是 non-obvious,就像透過 get_option()獲取非自動載入選項) 。你可以測量它。最簡單的例子:
$start = microtime(true);
// Do some stuff here
$end = microtime(true);
echo $start, PHP_EOL, $end, PHP_EOL, $end - $start, PHP_EOL,
配置您的程式碼非常簡單,有時是最合適的技術。 WordPress 擁有內部”stopwatch”,檢出 timer_start()和 timer_stop()。
或者你可以使用 XDebug 。配置似乎非常複雜。但您可以使用 VVV 或任何其他 ready-to-go 伺服器。所有這些都已經正確配置了 Xdebug,你可以使用它 – 聽起來不錯,不是嗎?如果你使用 VVV 只需點選幾個命令:
vagrant ssh
xdebung_on
就這樣!切換到您的 IDE 並配置您的程式碼。或使用 VVV 內部服務,如 WebGrind 。更多關於這種技術,你可以在 Code Debugging Wiki 找到。應該記住,使用 Xdebug 會對效能產生影響,但可以找到緩慢的程式碼 (瓶頸) 。
和第三。最後一件事。 WordPress 哲學是決策,而不是選項。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。