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