問題描述

當通過 WordPress 片段/教程/插件查看時,我經常看到 add_action()add_filter()被放置在函數聲明之前:

add_action( 'publish_post', 'email_friends' );

function email_friends( $post_ID ) {
   $friends = 'bob@example.org, susie@example.org';
   mail( $friends, "sally's blog updated" , 'I just put something on my blog: http://blog.example.com' );
   return $post_ID;
}

從邏輯的角度來看,這對我來説沒有意義。為什麼在代碼中調用函數後放置函數?這通常是如何處理同樣的情況:

function email_friends( $post_ID )  {
   $friends = 'bob@example.org, susie@example.org';
   mail( $friends, "sally's blog updated" , 'I just put something on my blog: http://blog.example.com' );
   return $post_ID;
}

add_action( 'publish_post', 'email_friends' );

我知道這兩種情況都有效,但是有一個或另一個具體的優勢嗎?大約 90%的時間我看到第一種情況被使用,所以這讓我相信在某種程度上有益處。

最佳解決方案

它更容易閲讀:什麼時候叫什麼?如果你正在調試一個鈎子,你可以立即看到你是否必須閲讀該功能:如果不是你的鈎子,你可以跳過代碼。

在我的主題和插件中,我結合了頂部的操作,過濾器和縮寫代碼的所有註冊,並將鈎子添加到 PHPDoc 塊中:

add_action( 'wp_head',  'foo' );
add_action( 'shutdown', 'bar' );

/**
 * Foo you!
 *
 * @wp-hook wp_head
 * @return  void
 */
function foo()
{
    print '<!-- foo -->';
}

次佳解決方案

實際上沒有什麼真正的區別,我比較喜歡跟隨第一種情況,因為在一個地方打電話,並定義下面的功能。 PHP 在運行任何東西之前解析整個文檔,如果函數被正確定義,一切都將正常工作,在任何一種情況下都沒有任何優勢。

我相信這裏説的正確的一點是:你的船漂浮什麼東西:)

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。