[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Наследование
meryfelow
Есть следующий код.
class one {
private $x=12;
public function getX(){
return $this->x;
}
}


class two extends one {
private $x=16;

}

$two = new two();
echo $two->getX();

Не пойму, почему выводится 12, я же вроде имею в наследованном классе такую же переменную со значением 16?



Спустя 11 минут, 49 секунд (28.07.2011 - 10:17) mako написал(а):
попробуй переопределить функцию во втором классе

Спустя 9 минут, 11 секунд (28.07.2011 - 10:26) SoMeOnE написал(а):
В наследуемом классе ты ничего не делаешь. Просто обявляешь переменную.
А обращаешься к функции
public function getX(){
return $this->x;
}

которая и возвращает тебе 12.
А лучше записывать так.
class one {
public static $x=12;

public function getX(){
return self::$x;
}
}

Спустя 34 секунды (28.07.2011 - 10:27) alex12060 написал(а):
meryfelow

Потому-что, после наследования, класс выглядит так:


class two {
private $x=16; // тут ставим

private $x=12; // а тут происходит переопределение
public function getX(){
return $this->x;
}
}


Спустя 4 минуты, 57 секунд (28.07.2011 - 10:32) meryfelow написал(а):
Ну как класс наследованный может так выглядить.
class two {
private $x=16; // тут ставим

private $x=12; // а тут происходит переопределение
public function getX(){
return $this->x;
}
}

Разве private наследуется?

Если переменная $x public или protected, то выводит 16, а вот c private - нет.

Как бы понятно, что переменная private $x не наследуется, но я все же ее объвляю в наследуемом классе, почему вот только подхватывает переменную родительского класаа?

Спустя 18 минут, 50 секунд (28.07.2011 - 10:50) alex12060 написал(а):
meryfelow

Ну они наследуются, так, формально. Напрямую ты все равно их вызвать не сможешь.
Вот я тебе пример даже сделал.


class one {
private $x=12;
private $d = 17;

public function getX(){
return $this->x;
}
}


class two extends one {
private $x=16;
private $n = 20;

}

$two = new two();
var_dump($two);
echo '<br /><br />';

echo $two->getX();


Посмотри на var_dump() класса потомка, он всё скомниздил, и как раз подтверждается моя теория об переопределении, только неявном.

Спустя 1 минута, 44 секунды (28.07.2011 - 10:52) alex12060 написал(а):
А если добавить метод getx() в класс two, то произойдет перегрузка свойств метода и выведет правильный ответ.


class one {
private $x=12;
private $d = 17;

public function getX(){
return $this->x;
}
}


class two extends one {
private $x=16;
private $n = 20;

public function getX(){
return $this->x;
}

}

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.