ООП: проблема доступа к свойству родителя от расширенного потомка - PullRequest
1 голос
/ 19 августа 2011

Я пытаюсь получить доступ к свойству родителя от его расширенного дочернего элемента, как показано ниже:

class Base
{
    protected static $me;
    protected static $var_parent_1;
    protected static $var_parent_2;

    public function __construct ($var_parent_1 = null)
    {
        $this->var_parent_1 = $var_parent_1;
        $this->me = 'the base';
    }

    public function who() {
        echo $this->me;
    }

    public function parent_1() {
        echo $this->var_parent_1;
    }
}

class Child extends Base
{
    protected static $me;
    protected static $var_child_1;
    protected static $var_child_2;

    public function __construct ($var_child_1 = null)
    {
        parent::__construct();
        $this->var_child_1 = $var_child_1;
        $this->me = 'the child extends '.parent::$me;
    }

    // until PHP 5.3, will need to redeclare this
    public function who() {
        echo $this->me;
    }

    public function child_1() {
        echo $this->var_child_1;
    }
}

$objA = new Base($var_parent_1 = 'parent var 1');
$objA->parent_1(); // "parent var 1"
$objA->who(); // "the base"

$objB = new Child($var_child_1 = 'child var 1');
$objB->child_1(); // "child var 1"
$objB->who(); // should get "the child extends the base"

Но я получаю "дочерний элемент" вместо "child расширяет базу ", если я использую $this->

Кажется нормальным, если я изменяю все $this-> на self::

Почему?

Этоединственный правильный способ доступа к свойству родителя, который заключается в изменении всех $this-> на self::?

РЕДАКТИРОВАТЬ:

Я удалил все static ключевые слова,

class Base
{
    protected $me;
    protected $var_parent_1;
    protected $var_parent_2;

    public function __construct ($var_parent_1 = null)
    {
        $this->var_parent_1 = $var_parent_1;
        $this->me = 'the base';
    }

    public function who() {
        echo $this->me;
    }

    public function parent_1() {
        echo $this->var_parent_1;
    }
}

class Child extends Base
{
    protected $me;
    protected $var_child_1;
    protected $var_child_2;

    public function __construct ($var_child_1 = null)
    {
        parent::__construct();
        $this->var_child_1 = $var_child_1;
        $this->me = 'the child extends '.parent::$me;
    }

    // until PHP 5.3, will need to redeclare this
    public function who() {
        echo $this->me;
    }

    public function child_1() {
        echo $this->var_child_1;
    }
}

$objA = new Base($var_parent_1 = 'parent var 1');
//$objA->parent_1(); // "parent var 1"
//$objA->who(); // "the base"

$objB = new Child($var_child_1 = 'child var 1');
$objB->child_1(); // "child var 1"
$objB->who(); // "the child extends the base"

Тогда я получаю эту ошибку Fatal error: Access to undeclared static property: Base::$me in C:\wamp\www\test\2011\php\inheritence.php on line 109, которая ссылается на эту строку,

$this->me = 'the child extends '.parent::$me;

Ответы [ 4 ]

1 голос
/ 19 августа 2011

(упрощенный ответ, я не знаю, как я мог бы объяснить это без написания 20 страниц, извините).

Во время выполнения ваши базовые и дочерние классы объединяются в один объект. В этом случае переменные вашего экземпляра также объединяются. Итак, вы не можете вызвать parent :: $ avar, вы можете просто вызвать $ this-> var (так как все переменные становятся элементами текущего экземпляра)

Поведение совершенно иное для методов: поскольку предполагается, что дочерний класс является специализацией базового класса, код, написанный в базовом классе, не обязательно должен быть полностью переписан: вы можете просто вызвать его и выполнить дополнительные операций, без необходимости переписывать исходный код в дочернем классе.

0 голосов
/ 19 августа 2011

Вам нужно прочитать о поздних статических привязках

http://www.php.net/manual/en/language.oop5.late-static-bindings.php

Попробуйте с ключевым словом static Но концепция ваших классов немного странная, вам нужно прочитать это также: http://www.php.net/manual/en/language.oop5.basic.php

0 голосов
/ 19 августа 2011

Пожалуйста, обратитесь к этому ответу , чтобы объяснить разницу между использованием себя и этим.

0 голосов
/ 19 августа 2011

статические свойства - это свойства классов, а не объектов, которые вы создаете с их помощью.Статическое свойство является общим для всех объектов этого класса, и доступ к нему осуществляется с помощью self ::

. Если вы удалите static, оно должно работать так, как вы хотите, и вы бы использовали $ this-> как и сейчас.

...