我想要一个类版本控制系统,它允许一个系统以一种未来任何变化不会影响已经存在的方式与另一个系统通信。
假设系统A和系统B通过RPC调用相互通信。业务需求发生变化,系统A和B需要在向后兼容时进行更改以供将来开发
以下方法可行:
class base_version
{
public static function getVersion($version = 1)
{
$versionClass = 'version_'.$version;
return new $versionClass();
}
}
class version_1
{
public function sayHello()
{
echo "Hello version 1\n";
}
}
class version_2
{
public function sayHello()
{
echo "Hello version 2\n";
}
}
$obj = base_version::getVersion();
$obj->sayHello();
$obj = base_version::getVersion(2);
$obj->sayHello();
然而,我不喜欢静态实例。我想做的就是这样,除了我知道你不能重新分配$this
。
class base_version
{
public function __construct($version)
{
$versionClass = 'version_'.$version;
$this = new $versionClass();
}
}
$obj = new base_version();
$obj->sayHello();
$obj = new base_version(2);
$obj->sayHello();
我怎样才能做到这一点?
答案 0 :(得分:1)
我认为对于带有已定义构造函数的抽象类,您可以做一些接近它的事情。
让我们提醒一下,抽象类需要至少有一个抽象函数,但也可以具有对于每个继承类都相同的具体函数[sic] *函数。抽象课程不能实现,只能是他们的孩子。
这里是:
abstract class base_version
{function __construct($version)
{$this->version = $version;
switch ($this->version)
{case 1:
// construct for class 1
break;
case 2:
// construct for class 2 etc.
break;
default:
// for careless programmers who won't define the constructor in the future
break;}}
function version()
{return $this->version;}
abstract function sayHello();}
这是一个基础抽象类。如果业务需求发生变化,可以在此处为构造函数中的新类添加案例。
class greeter extends base_version
{function sayHello()
{return 'This is the old version' . $this->version();
}}
class new_greeter extends base_version
{function sayHello()
{return 'Hello version ' . $this->version();
}}
这里抽象类的要点是,如果一个类在扩展抽象类时不抛出错误,必须实现一个函数sayHello()
。
这样,无论谁创建扩展base_version的类都不会破坏程序,因为对象将至少具有在基类中定义为抽象的那些函数。
所以它有一种方法定义可以及时改变而不会破坏旧版本工作方式的类
$obj = new greeter(1);
$obj ->sayHello();
$obj2 = new new_greeter(2);
$obj2->sayHello();