2014-12-03 118 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);