【问题标题】:Cast derived class to base class in php在php中将派生类转换为基类
【发布时间】:2013-05-09 21:03:08
【问题描述】:

我可能在这里遗漏了一些明显的东西,因为这是其他 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 是不同的类型。我可以想象有很多变通方法可以实现,但我想让事情尽可能简单。

【问题讨论】:

  • 你想达到什么目的?由于静态类型检查,某些语言需要这样做,但 PHP 使用动态类型。
  • 我了解 PHP 不是“真正的”OOP 语言这不准确,尤其是从 5.3 版开始。

标签: php oop inheritance casting


【解决方案1】:

您可以使用自定义函数来做到这一点:

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

【讨论】:

  • 我认为这应该是选择的答案。这很好用。
【解决方案2】:

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

【讨论】:

  • 是的,这是真的,或者可能是 php 的做事方式有点不同。这就是迫使我放弃使用这种语言的原因。
【解决方案3】:

在 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.
  }
}

【讨论】:

  • 您正在回答其他问题。我已经编辑了我的说明,说明了我为什么需要它。
  • 是的,我了解如何通过实施额外的检查和方法来实现相同的目标。但我认为直接比较将是最简单的方法(如果证明可能的话)。毕竟,我无法控制 assertEquals 方法——它来自 PHPUnit 库。
【解决方案4】:

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

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

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

    return $parentClassInstance;
}

【讨论】:

    猜你喜欢
    • 2017-01-08
    • 2013-11-17
    • 2021-02-18
    • 2017-07-18
    • 2011-02-04
    • 2012-09-15
    • 2011-06-30
    相关资源
    最近更新 更多