在php中将派生类转换为基类

时间:2013-05-09 21:03:09

标签: php oop inheritance casting

我可能在这里遗漏了一些明显的东西,因为这是其他OOP语言的基本功能,但我正在努力用PHP这样做。我知道PHP不是“真正的”OOP语言,但仍然......

我所追求的是将实例化为派生类的对象转换为基类。有点像:

class Some{}

class SomeMock extends Some {}

function GetSomeMock(){
  $mock = new SomeMock();
  return (Some)$mock; //Syntax error here
}

我发现了一些奇怪的请求,要求将基类的对象向下转换为派生,这可能会带来一些令人讨厌的调整,但这个基本功能并不一定非常困难。我在这里缺少什么?

编辑:似乎我要努力实现的目标始终如一。没问题。 GetSomeMock()是一个工厂方法,它将返回一个模拟对象存根(从基类派生,在构造函数中预先填充的所有属性)和预期的属性值。然后我会将它与从数据库中恢复的另一个基类型对象进行比较:

$this->assertEquals($mockObject, $realObject);

由于$ mockObject和$ realObject属于不同类型,因此立即失败。我可以想象我可以实现相同的许多变通方法,但我希望尽可能简单。

4 个答案:

答案 0 :(得分:5)

好的,简短的回答似乎是:这是不可能的。 PHP比我更了解我需要什么类型。

答案 1 :(得分:4)

在PHP中你不能转换为特定的类,我甚至看不到任何需要。 您可以转换为某种原生类型 - stringintarrayobject。但不是特定的课程。

如果您需要使用基类的某些功能,可以通过parent关键字进行操作。

class Some {
  public function execute(){
    echo "I am some" ;
  }
}

class SomeMock extends Some {
  public function execute(){ //Override the function
    parent::execute() ; //Here you can execute parent's functionality and add some more
  }
}

修改:

instanceof运营商可能派上用场。比较对象时。 例如:

$object = new SomeMock() ;
$status = ($object instanceof Some && $object instanceof SomeMock); //will return true here ;

子类继承非私有属性和方法。

让我们说,你有你的功能:

function assertEquals($mockObject, $realObject){
  if ($mockObject instanceof Some && $realObject instanceof Some){
    //Both objects have the same base class - Some
    //That means they must have inherited the functionality and properties of Some class.
  }
}

答案 2 :(得分:0)

您可以使用自定义功能执行此操作:

private function castParameter(BaseClass $parameters) : DerivedClass {
    return $parameters;
}

答案 3 :(得分:0)

当我需要将派生类强制转换为基类时,我确实遇到过用例。我做了以下。

function castToParentClass($derivedClassInstance) {
    $parentClassName = get_parent_class($derivedClassInstance);

    $parentClassInstance = new $parentClassName();
    foreach ($parentClassInstance as $key => $value) {
        $parentClassInstance->{$key} = $derivedClassInstance->{$key};
    }

    return $parentClassInstance;
}