Проблема со ссылками в php5

#php #class #object #reference

#php #класс #объект #ссылка

Вопрос:

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

 <?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 Fatal error: вызов функции-члена live() для не-объекта в ../test.php в строке 24»
Я некоторое время искал в Интернете и не могу найти решение, чтобы это работало.
Может ли кто-нибудь помочь мне с моим плохим пониманием php5?

Комментарии:

1. Знаете ли вы, что конструкторы должны называться __construct вместо NameOfTheClass в PHP5?

2. Нет, я этого не делал. Я просто изучаю язык, так как мне нужно что-то написать на нем для проекта. Спасибо за ваш совет 🙂

Ответ №1:

Вам нужно использовать $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.

Комментарии:

1. Ааа! Это полезно знать 🙂 — осталось 9 минут, пока это не станет решением ^^

Ответ №2:

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

 function Child($p){
    echo 'A child is born :)';
    $this->setParent($p);
}
  

Комментарии:

1. Обычно средства получения / установки предназначены для внешнего интерфейса, и внутренний доступ к полю напрямую лучше.

Ответ №3:

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

 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 методе.