PHP доступ к родительской переменной класса - PullRequest
34 голосов
/ 23 июня 2011
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();

Вопрос: Как отобразить родительскую переменную в child? ожидаемый результат будет повторять «родительский BB»

Ответы [ 6 ]

60 голосов
/ 23 июня 2011
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 разработки, но по-прежнему предоставлять все необходимые функции.

6 голосов
/ 23 июня 2011

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

echo $this->bb;
4 голосов
/ 08 марта 2013
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 голосов
/ 23 июня 2011

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

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

echo $this->bb;

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

2 голосов
/ 23 июня 2011

$ 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();
1 голос
/ 23 июня 2011

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

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

...