Проблема со ссылками в php5 - PullRequest
0 голосов
/ 16 апреля 2011

Позвольте мне начать прямо с кода:

<?php
class Father{
    function Father(){
        echo 'A wild Father appears..';
    }

    function live(){
        echo 'Some Father feels alive!';
    }
}

class Child{
    private $parent;
    function Child($p){
        echo 'A child is born :)';
    }

    function setParent($p){
        $parent = $p;
    }

    function dance(){
        echo 'The child is dancing, when ';
        $parent -> live();
    }
}

$p = new Father();
$p -> live();
$c = new Child($p);
$c -> dance();

?>

При выполнении этого я получаю сообщение об ошибке в строке 24, говорящее: «Неустранимая ошибка PHP: вызов функции-члена live () для необъекта в ../test.php в строке 24» Я некоторое время искал в Интернете и не могу найти решение, чтобы это работало. Может ли кто-нибудь помочь мне с моим плохим пониманием php5?

Ответы [ 3 ]

3 голосов
/ 16 апреля 2011

Вам нужно использовать $this->parent->live() для доступа к переменной-члену. Кроме того, вы должны назначить ему родительский объект.

class Child{
    private $parent;
    function __construct($p){
        echo 'A child is born :)';
        $this->parent = $p; // you could also call setParent() here
    }

    function setParent($p){
        $this->parent = $p;
    }

    function dance(){
        echo 'The child is dancing, when ';
        $this->parent -> live();
    }
}

Кроме того, вы должны переименовать ваши методы конструктора в __construct, что является рекомендуемым именем в PHP5.

2 голосов
/ 16 апреля 2011

Вы не вызвали setParent в своем конструкторе.
Это исправит это:

function Child($p){
    echo 'A child is born :)';
    $this->setParent($p);
}
0 голосов
/ 16 апреля 2011

Во-первых, предпочтительный способ использовать конструктор в PHP5 с помощью ключевого слова __construct.Когда вы получаете доступ к ученику, вы должны использовать $this, ведь в вашем случае вы этого не делали, когда пытались parent член.

function setParent($p){
        $parent = $p;
    }

Сделайте так:

function setParent($p){
        $this->parent = $p;
    }

И это:

   function dance(){
        echo 'The child is dancing, when ';
        $parent -> live();
    }

На это:

   function dance(){
        echo 'The child is dancing, when ';
        $this->parent -> live();
    }

Вы закончите с этим:

$p = new Father();
$p -> live();
$c = new Child();
$c -> setParent($p);
$c -> dance();

Вам не нужно проходитьродитель для дочернего конструктора, как вы установите его в методе setParent.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...