問題描述
使我的插件可擴展是解決大多數人的問題的下一個方法。而且我知道我可以在這裏和那裏放置大量的過濾器和動作鈎,使事情更加動態。但對我來説,這太亂了
最近我的插件的用户要求更改工具提示文本,在他們的情況下,這不是很糟糕的原因。該頁面上有 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。