0

我创建了几个使用公共类的 WordPress 插件。插件应该单独工作,理想情况下不需要将公共类作为单独的插件安装,但它们也可以在同一个安装中激活。现在我可以通过执行 class_exists 检查来防止多次加载该类,但我想更好地控制正在使用的类的哪个版本,最好是最新版本。这是因为用户可能没有更新其中一个插件,而它可能正是所使用的公共类的那个版本。有没有办法进行这样的检查?

我想防止这种情况发生:

  • 用户安装了 2 个不同的插件:WPFoo 和 WPBar,它们都使用 MyClass。
  • 用户拥有最新版本的 WPBar,但 WordPress 加载了旧版本的 MyClass,包含在 WPFoo 中,即使他已经在 WPBar 中拥有最新版本的 MyClass。
  • 理想情况下,用户不必担心这一点,因为他已经拥有最新版本。

我想到了以下场景:

  • 定义一个将存储类版本的全局变量 ($myclassversion)
  • WordPress 加载第一次出现的公共类并存储其版本
  • WordPress 出现了第二次出现的普通类。在加载类之前,将执行 class_exists 检查并将 $myclassversion 与此类版本进行比较。当此类版本较高时,旧类未设置,并加载新类。

但是,afaik 你不能通过简单地再次定义来取消设置/覆盖一个类,对吧?


一些附加信息:这些类已经分成不同的文件。我曾想过只是为每个插件命名不同的类,但最终他们修改了相同的内容,当他们一个接一个地这样做时会变得混乱(如果版本不同,每个方式都会略有不同)。

4

1 回答 1

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 文件。

于 2013-04-03T07:33:22.690 回答