我创建了几个使用公共类的 WordPress 插件。这些插件应该单独工作,理想情况下无需将公共类作为单独的插件安装,但它们也可以在同一安装中激活。现在,我可以通过执行 class_exists 检查来防止多次加载该类,但我希望更好地控制正在使用的类的版本,最好是最新版本。这是因为用户可能没有更新其中一个插件,并且它可能正是所使用的公共类的版本。有什么办法可以检查吗?
我想防止这种情况发生:
我想到了以下场景:
但是,据我所知,您不能通过简单地重新定义一个类来取消设置/覆盖它,对吗?
一些附加信息: 这些类已经分成不同的文件。我曾想过为每个插件以不同的方式命名类,但最终他们修改相同的内容,并且当他们一个接一个地这样做时会变得混乱(如果版本不同,每个插件的方式都会略有不同)。
有一种方法可以实现这一点,前提是您向包含版本的类添加一个常量。像这样:
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 文件。
PHP 有一些很好的函数来处理这个问题 version_compare 和 constant。
示例代码:
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")) {