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"
Ответы
Ответ 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
Видимость свойства или метода может быть определено путем префикса декларация с общедоступными ключевыми словами, защищенный или закрытый. Члены класса доступ к объявленной публике везде. Участники заявили, что защищены могут быть доступны только внутри класса себя и унаследованным и родительским классы. Члены, объявленные как частные могут быть доступны только классу, который определяет член.