Подтвердить что ты не робот

PHP Доступ к переменной родительского класса

class A {
    private $aa;
    protected $bb = 'parent bb';

    function __construct($arg) {
       //do something..
    }

    private function parentmethod($arg2) {
       //do something..
    }
}

class B extends A {
    function __construct($arg) {
        parent::__construct($arg);
    }
    function childfunction() {
        echo parent::$bb; //Fatal error: Undefined class constant 'bb' 
    }
}

$test = new B($some);
$test->childfunction();

Вопрос: Как отобразить родительскую переменную в дочернем? ожидаемый результат будет эхо "родительский bb"

4b9b3361

Ответ 1

echo $this->bb;

Переменная наследуется и не является частной, поэтому она является частью текущего объекта.


Вот дополнительная информация в ответ на ваш запрос для получения дополнительной информации об использовании parent:::

Используйте parent::, если вы хотите добавить дополнительные функции к методу из родительского класса. Например, представьте себе класс Airplane:

class Airplane {
    private $pilot;

    public function __construct( $pilot ) {
        $this->pilot = $pilot;
    }
}

Теперь предположим, что мы хотим создать новый тип самолета, который также имеет навигатор. Вы можете расширить метод __construct(), чтобы добавить новую функциональность, но все же использовать функциональность, предлагаемую родителем:

class Bomber extends Airplane {
    private $navigator;

    public function __construct( $pilot, $navigator ) {
        $this->navigator = $navigator;

        parent::__construct( $pilot ); // Assigns $pilot to $this->pilot
    }
}

Таким образом, вы можете следовать принципу

Ответ 2

class A {
    private $aa;
    protected $bb = 'parent bb';

    function __construct($arg) {
       //do something..
    }

    private function parentmethod($arg2) {
       //do something..
    }
}

class B extends A {
    function __construct($arg) {
        parent::__construct($arg);
    }
    function childfunction() {
        echo parent::$this->bb; //works by M
    }
}

$test = new B($some);
$test->childfunction();`

Ответ 3

Просто эхо его, поскольку он унаследовал

echo $this->bb;

Ответ 4

С помощью parent::$bb; вы пытаетесь восстановить статическую константу, определенную со значением $bb.

Вместо этого выполните:

echo $this->bb;

Примечание. вам не нужно вызывать parent::_construct, если B - это единственный класс, который его вызывает. Просто не объявляйте __construct в классе B.

Ответ 5

$bb теперь стал частным членом класса B после расширения класса A, где он был защищен.

Итак, вы получаете доступ к $bb, как к атрибуту класса B.

class A {
    private $aa;
    protected $bb = 'parent bb';

    function __construct($arg) {
       //do something..
    }

    private function parentmethod($arg2) {
       //do something..
    }
}

class B extends A {
    function __construct($arg) {
        parent::__construct($arg);
    }
    function childfunction() {
        echo $this->bb; 
    }
}

$test = new B($some);
$test->childfunction();

Ответ 6

все свойства и методы родительского класса наследуются в дочернем классе, поэтому теоретически вы можете получить к ним доступ в дочернем классе, но будьте осторожны с использованием ключевого слова protected в своем классе, потому что он генерирует фатальную ошибку при использовании в дочернем классе класс.
как указано в php.net

Видимость свойства или метода может быть определено путем префикса декларация с общедоступными ключевыми словами, защищенный или закрытый. Члены класса доступ к объявленной публике везде. Участники заявили, что защищены могут быть доступны только внутри класса себя и унаследованным и родительским классы. Члены, объявленные как частные могут быть доступны только классу, который определяет член.