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