@vrazbros

Как наследуются метода в PHP?

Мне казалось что я знаю что такое наследование в PHP, но недавно столкнулся с таким вопросом:
Что выведется на экран ?

<?php

class A {
    private $value;

    public function setValue($val) {
        $this->vаlue = $val;
    }

    public function getValue() {
        echo __CLASS__;
        return $this->vаlue;
    }
}

class B extends A {
    private $value;

    public function setValue($val) {
        $this->value = $val;
    }
}


$a = new A();
$b = new B();
$a->setValue(123);
$b->setValue(555);

echo $a->getValue(); // выводит 123
echo $b->getValue();  // ничего не выводит ? wtf ?


Выводит только 123, не могу понять почему не выводит 555 ? мы же наследуем метод getValue и он должен вернуть свойство $value класса B...или как это понимать ?
  • Вопрос задан
  • 77 просмотров
Пригласить эксперта
Ответы на вопрос 4
@Arik
точно не помню можно так приватные свойства и методы переназначать, может ошибки отключены и не видно что так делать нельзя?)
а так getValue() имеет доступ к своему приватному свойству, но никак не к приватному наследнику, если бы protected, что будет если сделать:

class A {
    private $vаlue = 333;
//...
Ответ написан
Комментировать
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
private нельзя трогать и оно не распространяется между дочерними/родительскими классами.
Ответ написан
Комментировать
Melkij
@Melkij
PostgreSQL DBA
Для начала обратите внимание, что vаlue и value - две разные переменные. Буква а, да.

А по существу подсказку даёт любезно написанный echo __CLASS__. getValue в обоих случаях работает в контексте класса A и видит только свойство класса A.
setValue в B видит же только своё собственное value, существующее только в этом классе и не имеет доступа к свойству из A

var_dump($b); хорошо пояснит происходящее:
object(B)#2 (2) {
  ["value":"B":private]=>
  int(555)
  ["vаlue":"A":private]=>
  NULL
}
Ответ написан
Комментировать
@PashaNedved
Приватные свойства наследуются, но их нельзя переопределить. Так, если A::$value инициализировано со значением 777, то B::$value всегда будет иметь значение 777.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы