【问题标题】:Selecting latest version of a class选择最新版本的课程
【发布时间】:2013-04-03 07:20:57
【问题描述】:

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

我想防止这种情况发生:

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

我想到了以下场景:

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

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


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

【问题讨论】:

    标签: php class versioning wordpress


    【解决方案1】:

    如果您向包含版本的类添加一个常量,则有一种方法。像这样:

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

    【讨论】:

    • 这至少可以防止使用“过时”版本,但用户并不清楚他/她应该为此更新另一个插件。我可以添加另一个 constant PLUGIN = 'That plugin' 并在错误消息中使用该变量,但我宁愿选择该类的最新版本(该插件已包含该类,只是未加载,因为旧插件具有更高的优先级) .
    • @Ewout 绝对。甚至您可以将用户重定向到包含最新版本插件的下载页面。因此,您应该将插件版本信息定位在插件的中心类中,或者您可以将其定义为合并到插件源中的全局常量。
    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多