kakadyi
26.03.2015 - 04:53
class people{
private $name = 'Hello';
public function getName(){
echo $this->name;
}
}
class man extends people{}
$p = new people();
$m = new man();
$p->getName(); // Hello
$m->getName(); // Hello
Всем доброго времени суток!
Приватные свойства и методы не наследуются. Тогда почему при вызове публичного метода дочернего класса $m->getName() выводится Hello?Ведь приватное свойство private $name = 'Hello' не должно было наследоваться классом man.А по сути,получается,что класс man вызывает метод,который получает доступ к приватному свойству родительского класса,который он не должен видеть.А если переопределить метод в дочернем классе,попросту скопировав строку с родительского класса
class people{
private $name = 'Hello';
public function getName(){
echo $this->name;
}
}
class man extends people {
public function getName(){
echo $this->name;
}
}
$p = new people();
$m = new man();
$p->getName(); // Hello
$m->getName(); //
,
то Hello уже не выведет.Где я ошибаюсь,не пойму?
volter9
26.03.2015 - 05:05
kakadyi
Ну да к в документации все написано:
Цитата |
... Модификатор private (закрытый) ограничивает область видимости так, что только класс, где объявлен сам элемент, имеет к нему доступ. |
http://php.net/manual/ru/language.oop5.visibility.phpВ первом примере, метод не переопределен, по этому getName действует из контекста класса human (который имеет доступ к приватному свойству). Во втором примере метод уже определен в классе man (и его контексте), значит он не имеет доступ к приватному свойству класса human. Так же, это приватное свойство можно получить через вызов метода у супер класса (через parent::getName()):
class people{
private $name = 'Hello';
public function getName(){
echo $this->name;
}
}
class man extends people {
public function getName(){
echo $this->name;
}
}
class woman extends people {
public function getName(){
parent::getName();
}
}
$p = new people();
$m = new man();
$w = new woman();
$p->getName();
$w->getName();
$m->getName();
_____________
Мой блог
Игорь_Vasinsky
26.03.2015 - 09:17
у тебя приватное свойство в публичном методе.
это говорит о том - что доступ к свойству родительского класса ты напрямую не получишь, но ты же используешь публичный метод где используется это свойство - поэтому оно и выводиться.
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
bestxp
26.03.2015 - 10:16
чуть позже автору сломаю мозг ещё раз)))
Чтобы разобраться самому предлагают поюзать вот такой пример:
class people{
private $name = __CLASS__;
public function getName(){
return $this->name;
}
}
class man extends people{
private $name = __CLASS__;
}
class wooman extends people{
public $name = __CLASS__;
}
class white_man extends people{
public function getName(){
return parent::getName();
}
}
class black_man extends people{
private $name = __CLASS__;
public function getName(){
return parent::getName();
}
}
class super_man extends people{
private $name = __CLASS__;
public function getName(){
return $this->name;
}
}
$p = new people();
$m = new man();
$wm = new wooman();
$w = new white_man();
$b = new black_man();
$s = new super_man();
echo $p->getName() . PHP_EOL;
echo $m->getName() . PHP_EOL;
echo $wm->getName() . PHP_EOL;
echo $w->getName() . PHP_EOL;
echo $b->getName() . PHP_EOL;
echo $s->getName() . PHP_EOL;
_____________
Трус не играет в хокей