問題描述
當沒有必要時,我看到很多使用 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_Box和Simple_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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。