选择课程的最新版本

问题描述 投票:0回答:2

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

我想防止这种情况发生:

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

我想到了以下场景:

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

但是,据我所知,您不能通过简单地重新定义一个类来取消设置/覆盖它,对吗?


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

php class versioning wordpress
2个回答
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
投票

PHP 有一些很好的函数来处理这个问题 version_compareconstant

示例代码:

class version {
    const version = "1.0.1";

    public static function check(object $class,string $min_version): bool {
        if(preg_match("/^\d\.\d\.\d/gs",$min_version)) {
            if((class_exists($class,false)) && (defined("$class::version"))) {
                $class_version = constant($class."::version");
                if (version_compare($class_version, $min_version) >= 0) {
                    return true;
                }
            }
        }
        return false;
    }
}

可调用,如果版本等于或大于 3.5.8,则返回 true:

if(version::check($MyClass,"3.5.8")) {
© www.soinside.com 2019 - 2024. All rights reserved.