2013-05-09 119 views
3

我可能错过了一些明显的东西,因为这是其他OOP语言的基本功能,但我正在努力与PHP的方式做到这一点。我明白,PHP是不是“真正的”OOP语言,但仍然...在派生类派生类到基类在PHP

我后来把一个对象实例化为派生类到基类。沿着线的东西:

class Some{} 

class SomeMock extends Some {} 

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

我发现有向下转换的基类对象派生这可能与一些讨厌的扭动奇怪的要求的一些问题,但这些基本功能并不一定是困难的。我在这里错过了什么?

编辑:它似乎总是重要的,我试图实现。没问题。 GetSomeMock()是一个工厂方法,它将返回一个模拟对象存根(派生自基类,构造函数中预填充的所有属性)和预期属性的值。然后我会比较它的基本类型的另一个目的是从数据库恢复:

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

这瞬间失败为$ mockObject和$ realObject是不同类型的。我可以想象有很多解决方法可以实现,但我希望尽可能简单。

+1

你想达到什么目的?由于静态类型检查,这在某些语言中是必需的,但PHP使用动态类型。 – Barmar 2013-05-09 21:07:03

+2

_我明白PHP不是“真正的”OOP language_这是不准确的,特别是从5.3版本开始。 – 2013-05-09 21:07:06

回答

3

好了,简单的答案似乎是:这是不可能的。 PHP比我知道我需要什么类型。

4

在PHP中,你不能转换成特定的类,我什至不能看到任何需要。 您可能会投射某种原生类型 - string,int,array,object。但不是特定的班级。

如果您需要使用基类的某些功能,您可以通过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. 
    } 
} 
+0

您正在回答其他一些问题。我编辑了我的说明,为什么我需要这个。 – 2013-05-09 21:15:57

+0

@StanislavKniazev我刚刚编辑了我的答案。看一看。 – vikingmaster 2013-05-09 21:24:30

+0

是的,我了解如何通过实施额外的检查和方法来实现相同的目标。但我认为直接比较是最简单的方法(如果证明可行)。毕竟,我无法控制assertEquals方法 - 它来自PHPUnit库。 – 2013-05-09 21:33:22