2013-04-03 55 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

相关问题