如果存在,使用备用类



我正试图将使用函数的旧代码转换为使用类。一些旧代码只有在设置高级选项时才有可用的选项。基类中我已经把所有的函数(方法)。如果该函数作为高级选项可用,则在第二个类中覆盖它。如果没有,它应该说在基类中不可用。问题是,我不知道如何调用一个类或另一个类,当然,除非输入一堆if。

原来的函数是这样的

function Testclass() {
if (advanced_enabled) 
return 'Do advacned stuff<br>';
else 
return 'Do base stuff<br>';         
}

这是我的类:

class A {
public function Testclass() {
return 'in base class<br>';
}       

public function SomeBaseCode() {
}
}
class B {
public function Testclass() {
return 'in advanced class<br>';
}       
}

如果我这样做:

$a = new A(); 
echo 'base '.$a->Testclass();
$b = new B(); 
echo 'base '.$b->Testclass();

输出为

in base class
in advanced class

我想做的是使用高级类,如果有的话。但是基类必须存在,因为它的方法总是可用的。我可以这样做

$a = new A(); 
echo 'base '.$a->Testclass();
if (advanced_enabled) {
$b = new B(); 
echo 'base '.$b->Testclass();
}

但是这给了我两个不同的类变量,我必须编辑大量的代码来检查每个变量。我对课程很陌生,所以可能我遗漏了一些基本的概念。有办法做到这一点吗?

您的高级类B需要从基类a扩展。

class A {
public function Testclass() {
return 'in base class<br>';
}       

public function SomeBaseCode() {
}
}
class B extends A {
public function Testclass() {
return 'in advanced class<br>';
}       
}

实例化基于advanced_enabled标志。

$a = advanced_enabled ? new A() : new B();
$a->SomeBaseCode();
$a->Testclass();

不使用new直接创建类,而是使用Factory来完成此操作。这个工厂可以是一个不同的类,也可以是一个简单的函数。如果你使用任何PHP框架,你可能会使用依赖注入,它可以为你解决这个问题。

如果你不想重新定义所有的方法(即B中的一些方法应该与A中的完全相同),你可以使用extend关键字让类B从类A继承所有你没有覆盖的方法。这个原则被称为对象继承。

在伪php中,它看起来像这样:
// Define classes (interface is optional, but recommended)
interface someInterface {
public function testClass();
public function someOtherFunction();
}
class simpleVersion implements someInterface {
public function testClass() { /* ... */ }
public function someOtherFunction() { /* ... */ }
}
class advancedVersion extends simpleVersion {
public function testClass() { /* ... */ }
// someOtherFunction is not defined here. but is still usable!
}
// Create the factory responsible for instantiating the class
function createVersion() {
return $advancedEnabled ? new advancedVersion(); : new simpleVersion();
}
// Create the class instance (dynamically) and use it
$class = createVersion(); // $class is now either simpleVersion or advancedVersion.
$class->testClass();

同样,如果你想让类B方法做一些"高级"的事情,而保持类a的功能,你可以使用特殊的parent::something();调用来"复制"基类的功能:

class Shouter() {
public function shout($text) {
return strtoupper($text);
}
}
class LoudShouter() extends Shouter {
public function shout($text) {
return parent::shout($text) . '!!!';
}
}
$text = 'Hello World';
$shouter1 = new Shouter();
$shouter2 = new LoudShouter();
var_dump(
$text,
$shouter1->shout($text),
$shouter2->shout($text)
);
// Output:
// -> Hello World
// -> HELLO WORLD
// -> HELLO WORLD!!!