2013-05-09 118 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