2013-04-03 52 views
0

我已經創建了幾個使用普通類的WordPress插件。插件應該單獨工作,理想情況下不需要將普通類作爲單獨的插件安裝,但也可以在同一安裝中激活它們。現在,我可以通過執行class_exists檢查來防止多次加載類,但我希望能夠更多地控制正在使用哪個版本的類,最好是最新版本。這是因爲用戶可能不更新其中一個插件,而且它可能正是使用的通用類的版本。有沒有辦法進行這種檢查?選擇一個類的最新版本

我想避免這種情況發生:

  • 用戶安裝了2個不同的插件:WPFoo & WPBar,它們都使用MyClass的。
  • 用戶擁有WPBar的最新版本,但WordPress加載了舊版本的MyClass,包含在WPFoo中,即使他已經在WPBar中具有最新版本的MyClass。
  • 理想情況下,用戶不必擔心這一點,因爲他已經擁有最新版本。

我想以下情景:

  • 定義一個全局變量中的類版本將被存儲($ myclassversion)
  • WordPress的加載普通類第一次出現的&存儲其版本
  • WordPress擊中了普通班的第二次出現。在加載類之前,會執行class_exists檢查,並將$ myclassversion與此類版本進行比較。當這個級別的版本更高時,舊的級別未設置,並加載新的級別。

但是,afaik你不能通過簡單地定義它來重置/重寫一個類,對吧?


一些額外的信息: 的類已經分裂成不同的文件。我曾想過爲每個插件命名類,但最終它們會修改相同的內容,並且當它們一個接一個地插入時(如果版本不同,每個插入方式略有不同)會變得混亂。

回答

2

只要給包含版本的類添加一個常量,就有一種方法。就像這樣:

class MyCommonClass { 
constant VERSION = '2'; 

// Accessing via INSTANCE 
function showVersion() { 
    echo self::VERSION . "\n<br/>"; 
} 

} 

// Accessing globally 
echo MyCommonClass::VERSION . "\n<br/>"; 

// Programmatically As of PHP 5.3.0 

$classname = "MyCommonClass"; 
echo $classname::VERSION. "\n<br/>"; // As of PHP 5.3.0 

所以檢查:

if(class_exists("MyCommonClass")){ 
    if (MyCommonClass::VERSION < 2){ 
     echo "This plugin requires newest version of MyPackage\n<br/>"; 
     exit(0); 
    } 
}; 

您也可以劃分成類文件,包括它們與類檢查相應。

最後的壞實踐方式包括在一個文件中的類是這樣的:

<?php 
$versionOfclass = 2; 
if($versionOfClass >= $requiredVersionOfClass) { 
class MyClass { 

} 
} 
?> 

其中$ requiredVersionOfClass來自PHP文件,其中包括這一點。

+0

這樣至少可以防止使用「過時」版本,但用戶不太清楚他/她應該爲此更新另一個插件。我可以添加另一個'常量PLUGIN ='該插件'並在錯誤消息中使用該變量,但我寧願選擇該類的最新版本(該插件將包含該插件,因爲較舊插件會有更高的優先級)。 – Ewout

+0

@Ewout絕對。即使您可以將用戶重定向到包含最新版插件的下載頁面。所以你應該在插件的中心類中定位你的插件版本信息,或者你可以將它定義爲插入到你的插件源的全局常量。 – Ihsan

相關問題