PHP: Как вызвать частные значения родительской конструкции в дочерней конструкции? - PullRequest
0 голосов
/ 28 марта 2011

Я хочу иметь возможность установить значение частного атрибута в родительском конструкторе и вызвать его в дочернем конструкторе или методе.

Например:

<?php


abstract class MainClass
{
    private $prop_1;
    private $prop_2;


     function __construct()
     {
            $this->prop_2 = 'this is  the "prop_2" property';
     }
}

class SubClass extends MainClass
{
    function __construct()
    {
        parent::__construct();
        $this->prop_1 = 'this is the "prop_1" property';
    }

    public function GetBothProperties()
    {
        return array($this->prop_1, $this->prop_2);
    }

}

$subclass = new SubClass();
print_r($subclass->GetBothProperties());

?>

Вывод:

Array
(
    [0] => this is the "prop_1" property
    [1] => 
)

Однако, если я изменю prop_2 на protected, вывод будет:

Array
(
    [0] => this is the "prop_1" property
    [1] => this is  the "prop_2" property
)

У меня есть базовые знания о OO и php, но я не могу понять, что мешает prop_2 вызываться (или показываться?), Когда это private;это не может быть частная / публичная / защищенная проблема, так как prop_1 является частной и может вызываться и показываться ... верно?

Это проблема присвоения значений в дочернем классе по сравнению с родительским классом?

Буду признателен за помощь в понимании, почему.

Спасибо.

Ответы [ 3 ]

6 голосов
/ 28 марта 2011

Если вы хотите получить доступ к свойствам родителя из дочернего класса, вы должны сделать его свойства защищенными, а не частными.Таким образом, они все еще недоступны извне.Вы не можете переопределить видимость личных свойств родителя в дочернем классе так, как вы пытаетесь.

6 голосов
/ 28 марта 2011

Частные свойства родительского класса недоступны в дочернем классе и наоборот.

Вы можете сделать это

abstract class MainClass
{
   private $prop_1;
   private $prop_2;


   function __construct()
   {
        $this->prop_2 = 'this is  the "prop_2" property';
   }

   protected function set($name, $value)
   {
        $this->$name = $value;
   }

   protected function get($name)
   {
      return $this->$name;
   }

 }


class SubClass extends MainClass
{
    function __construct()
    {
        parent::__construct();
        $this->set('prop_1','this is the "prop_1" property');
    }

    public function GetBothProperties()
    {
        return array($this->get('prop_1'), $this->get('prop_2'));
    }

}
2 голосов
/ 28 марта 2011

Как уже отмечали другие, вам нужно изменить свойства родителя на protected.Однако другой способ заключается в реализации метода get для родительского класса, который позволяет вам получить доступ к свойству, или реализации метода set, если вы хотите переопределить его.

Итак, в вашем родительском классе вы бы объявили:

protected function setProp1( $val ) {
  $this->prop_1 = $val;
}

protected function getProp1() {
  return $this->prop_1;
}

Затем в своем дочернем классе вы можете получить доступ к $this->setProp1("someval"); и $val = $this->getProp1() соответственно.

...