問題描述

當沒有必要時,我看到很多使用 object-oriented 編碼的插件。

但更糟糕的是,主題開發人員開始做同樣的事情。商業主題和免費受歡迎的主題,如 Suffusion,甚至我最喜歡的主題 – 混合,將所有的功能都放在一個類中,在 functions.php 中實例化一次,並以程序方式運行它的功能:)

跆拳道?這是什麼意思?顯然,您不會同時使用兩個或更多個相同主題的實例。

我們假設插件為命名空間做了這個 (這是可笑的),但主題是什麼呢?我錯過了什麼嗎?

編碼這樣的主題有什麼好處?

最佳解決方案

我可以根據你提供的例子瞭解你的困惑。這真的是一個糟糕的方式來使用一個類… 只是因為使用一個類,不會使系統 OOP 。

在混合的情況下,他們只是使用一個類來命名其功能。考慮到混合是一個主題框架,這樣做是為了讓孩子的主題可以讓 re-use 的函數名不用開發人員擔心名字衝突。在許多情況下,主題框架 (父主題) 是如此複雜,許多兒童主題開發人員根本不會明白什麼。

如果 Hybrid 沒有使用類結構,則子主題開發人員需要知道現有的所有函數調用是否可以避免使用 re-using 名稱。是的,您可以使用獨特的插件為所有的功能添加前綴,但這會使代碼難以閲讀,難以維護,如果您開發更多使用相同功能的系統,那麼 non-reusable 是固有的。

回答你的問題

Wtf? What’s the point of doing this? Obviously you won’t be using two or more instances of the same theme, at the same time.

不,您不會使用兩個或多個相同主題的實例。但是像我所説的,在這種情況下,想到類的結構是命名函數,而不是創建一個傳統的對象實例。將所有內容集中在一個類中,並將其實例化為調用方法 (myClass->method();) 或直接調用方法 (myClass::method();) 是以可讀,可重用的方式命名空間的一種非常乾淨的方式。

當然,你可以隨時使用像 myClass_method(); 這樣的東西,但是如果你想在其他主題,插件或者 antoher 框架中重新使用這些代碼,你必須回頭再來改變所有的前綴。將所有內容都保持在一個課堂上是比較乾淨的,並允許您更快地重新開發和重新部署。

Let’s assume that the plugins do this for the namespace (which is ridiculous), but what’s the theme excuse? Am I missing something?

在大多數情況下,我同意你的看法。然而,這個多數人正在迅速消失。我在 MultiSite 上安裝多個使用相同主題變體的站點。而不是 re-create 相同的主題一遍又一遍地有微小的差異,我有一個單一的”class” 為父主題和所有的小題目擴展該類。這允許我為每個站點定義自定義功能,同時仍然保持整個網絡的一致性。

一方面,主題開發人員可以選擇一個 class-based 方法來命名其功能 (如果您在一個或多個同一代碼的 re-use 塊中工作的環境中工作,這是不可笑的) 。另一方面,主題開發人員可以選擇一種 class-based 方法,以便通過兒童主題進行易於擴展。

What’s the advantage of coding a theme like this?

如果您只在您的網站上使用混合版,那麼對於最終用户來説,幾乎沒有什麼優勢。如果您正在為 Hybrid 構建一個子主題,那麼它們具有命名空間和擴展性的優點。如果您為 ThemeHybrid 工作,則優勢在於您可以在其他項目 (Prototype,Leviathan 等) 中快速高效的代碼重用。

如果您是一個喜歡 Hybrid 而不是整個主題的特定功能的主題開發人員,則優勢在於您的 non-Hybrid 項目中的快速,高效的代碼重用 (假設它也是 GPL) 。

次佳解決方案

Speed

我目前的基礎主題有 13 節課。當我建立一個新的主題,我要麼使用這些類,因為它們是或我擴展它們。該系統使得構建新主題的過程非常快速。

緊密的範圍

我很少需要全局變量,因為我的代碼必須知道的一切隱藏在類成員中。所以我可以在兩個非常不同的過濾器或動作之間共享一個變量,而不會與寫入不當的插件相沖突。

Maintenance

每個類都是一個文件。如果我需要更新客户端的主題,我只是更新一些文件。只要我提供相同的 API,班級內的任何事情都取決於我。

一個例子:在 comment_form(); 調用之上,我使用一個簡單的動作:

do_action( 'load_comment_class' );
comment_form();

將加載哪個註釋類決定我的控制器。在評論類中確切發生的是決定單個類。

嘗試一個純粹的程序方法,你會堅果。 🙂

Readability

如果您根據任務分離了所有內容,幾個月後就可以輕鬆地重讀和理解自己的代碼。

一些有用的類層次結構的例子

  •  Meta_Box – > 由 Shortdesc_Meta_BoxSimple_Checkbox_Meta_Box 擴展 – > 由 Sidebar_Switch 擴展
  •  User_Profile_Addon – > 由 User_Profile_Checkbox 延伸 (見 Question 3255)
  •  Comment_Form – > 由 {$theme_name}_Comment_Form 擴展

第三種解決方案

另一點要考慮:速度。

if ( !class_exists('cccYourClassName') )
// VERSUS
if ( !function_exists('ccc_your_function_name') )

經過短暫的查看/打印出來,我發現〜 1.700 內部功能和〜 1.400 個用户功能=〜 3.100 / 3.200 功能 VS. 〜 250 課。我想這最多關於需要多少查詢。如果您在主題中調用了大約 50-100 個功能的!function_exists(''),只需設置一個計時器,然後開始做一些數學。即使不是 OOP,這是編寫代碼的好方法

1) 可重複使用 2) 可維護 3) 可交換 4) 更快

當您瀏覽在網絡上浮動的不同類別,可以幫助您快速地進行元框,小工具等,那麼使用 @toscho 所提到的控件,這是很好的,因為您只需將類插入並且只是替換控制器中的一些處理你的類的行。

參考文獻

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