2014-12-03 117 views
-2

如何通過引用父級傳遞對象?通過引用傳遞父級PHP類

我有以下腳本,並收到以下錯誤。

嚴格的標準:myChild :: myMethod的(聲明)應 與myParent :: myMethod的($ ID = NULL,& $模式= NULL)在 在/ var/WWW/bidjunction/HTML /兼容測試/passbyreference.php第19行

<?php 
class myParent 
{ 
    public function myMethod($id=null,&$model=null) 
    { 
     $model=$model?$model:new stdClass(); 
     var_dump($model); 
    } 
} 

class myChild extends myParent 
{ 
    public function myMethod($id=null,$model=null) 
    { 
     $model=new stdClass(); 
     $model->foo='bar'; 
     parent::myMethod(123,$model); 
    } 
} 
class myOtherChild extends myParent{} 

$myChild=new myChild(); 
$myChild->myMethod(); 

$myOtherChild=new myChild(); 
$myOtherChild->myMethod(); 
?> 
+0

你傳遞'$ model'由裁判在父,但不是孩子 – andrew 2014-12-03 13:05:43

+0

@andrew。如何以孩子的參考爲基礎? – user1032531 2014-12-03 13:07:01

+0

看看方法簽名和你的錯誤應該很容易被發現 – PeeHaa 2014-12-03 13:10:50

回答

2

我會給出一些關於錯誤的一般信息。它被拋出是因爲方法參數不一樣。您的父類需要一個指向引用的指針,而您的孩子期望實例本身。如果您覆蓋功能,則方法名稱和參數必須相同。

變化,所以他們都期待一個指針:

class myParent 
{ 
    public function myMethod($id=null,&$model=null) 
    { 
    } 
} 

class myChild extends myParent 
{ 
    public function myMethod($id=null,&$model=null) 
    { 
    } 
} 

或者,他們都希望實例

class myParent 
{ 
    public function myMethod($id=null,$model=null) 
    { 
    } 
} 

class myChild extends myParent 
{ 
    public function myMethod($id=null,$model=null) 
    { 
    } 
} 
+1

這可能是更好的避免術語「指針「; PHP的引用並不像C那樣是真正的指針(你不需要明確地去引用它們),它們更像「別名」,給出了相同的變量倍數,不可區分的名稱。除此之外,清楚的解釋,所以+1。 – IMSoP 2014-12-03 13:20:16

0

安德魯在註釋中說。當重寫子類中的方法或繼承類時,根據LISKOV SUBSTITUTION原則,您的方法簽名在兩種方法中都應該相同。

http://en.wikipedia.org/wiki/Liskov_substitution_principle

+0

您能否提供關於如何修改腳本以符合Liskov替換原則的建議? – user1032531 2014-12-03 13:07:53

+0

只是讓兩行代碼說'公共函數myMethod($ id = null,&$模型= null)'相同,而不是其中的一個錯過'&' – IMSoP 2014-12-03 13:14:33

0

當你擴展一個類,你要擴展這個類類型,而不是它的實例,如果希望家長能夠獲得孩子必須把它注射

class myParent 
{ 

    public $child; 

    public function addChild($child){ 
     $this->child = $child; 
    } 


} 

$myParent = new parent(); 

$myChild=new myChild(); 

$myParent->addChild($myChild);