2014-12-03 3 views
-2

Как передать объект по ссылке на родительский класс?Передача по ссылке на родительский класс PHP

У меня есть следующий скрипт и получите следующую ошибку.

Строгие стандарты: Декларация myChild :: MyMethod() должны быть совместимы с myParent :: MyMethod в /вар/WWW/bidjunction/HTML/тестирования ($ ID = NULL, & $ модели = NULL) /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

+0

@andrew. Как это может быть основано на ссылке ребенка? – user1032531

+0

Посмотрите на методы подписи, и ваша ошибка должна быть легко обнаружена – PeeHaa

ответ

2

Приведем некоторые общие сведения об ошибке. Это выбрано потому, что параметры метода не совпадают. Ваш родительский класс ожидает указатель на ссылку, в то время как ваш ребенок ожидает сам экземпляр. Если вы переопределяете функции, имя метода и параметры должны быть идентичными.

Change, поэтому они оба ожидают указатель:

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

0

Как сказал андрей в комментарии. Подписи методов должны быть одинаковыми в обоих методах в соответствии с принципом LISKOV SUBSTITUTION при переопределении методов в дочернем или наследующем классе.

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

+0

Не могли бы вы дать рекомендации относительно того, как сценарий должен быть изменен в соответствии с Принципом замещения Лискова? – user1032531

+0

Просто сделайте две строки, которые говорят 'public function myMethod ($ id = null, & $ model = null)', идентичные, а не один из них, пропускающий '&' – IMSoP

0

при расширении класса, вы расширяете этот тип класса, а не экземпляр этого, если вы хотите, родитель, чтобы иметь доступ к ребенку необходимо придать ему

class myParent 
{ 

    public $child; 

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


} 

$myParent = new parent(); 

$myChild=new myChild(); 

$myParent->addChild($myChild); 
Смежные вопросы