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»
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 } }
Таким образом, вы можете следовать принципу DRY разработки, но при этом предоставить все необходимые функции.
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();`
Просто повторите его, так как он унаследован
echo $this->bb;
С parent::$bb;
вы пытаетесь получить статическую константу, определенную со значением $bb
.
Вместо этого выполните:
echo $this->bb;
Примечание: вам не нужно вызывать parent::_construct
если B – единственный класс, который его вызывает. Просто не объявляйте __construct в классе B.
$ 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();
все свойства и методы родительского класса наследуются в дочернем классе, поэтому теоретически вы можете получить к ним доступ в дочернем классе, но будьте осторожны с использованием protected
ключевого слова в своем классе, потому что он генерирует фатальную ошибку при использовании в дочернем классе.
как упоминалось в php.net
Видимость свойства или метода может быть определена путем префикса декларации ключевыми словами public, protected или private. К членам класса, объявленным публичными, можно получить доступ во всех странах. Доступ к элементам, объявленным защищенными, может быть доступен только внутри самого класса и наследуемых и родительских классов. Участникам, объявленным как private, может быть доступен только класс, определяющий участника.