2

親コンストラクターでプライベート属性の値を設定し、子のコンストラクターまたはメソッドで値を呼び出すことができるようにしたいと考えています。

例えば:

<?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
)

私はオブジェクト指向と php の基本的なprop_2知識を持っていますが、それがprivate; 「prop_1」はプライベートであり、呼び出して表示できるため、プライベート/パブリック/保護の問題になることはありません...そうですか?

子クラスと親クラスの値の割り当ての問題ですか?

理由を理解するための助けをいただければ幸いです。

ありがとうございました。

4

4 に答える 4

6

親クラスのプライベートプロパティは、子クラスではアクセスできません。その逆も同様です。

あなたはこのようにすることができます

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'));
    }

}
于 2011-03-28T10:26:39.880 に答える
6

子クラスから親のプロパティにアクセスする場合は、親のプロパティを非公開にしないで保護する必要があります。このようにして、それらはまだ外部からアクセスできません。しようとしている方法で、子クラスで親のプライベート プロパティの可視性をオーバーライドすることはできません。

于 2011-03-28T10:29:27.320 に答える
2

他の人が指摘したように、親のプロパティを に変更する必要がありますprotected。ただし、もう 1 つの方法はget、プロパティへのアクセスを可能にする親クラスのメソッドを実装するか、setメソッドをオーバーライドする機能が必要な場合はメソッドを実装することです。

したがって、親クラスで次のように宣言します。

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

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

次に、子クラスで、それぞれ$this->setProp1("someval");およびにアクセスできます。$val = $this->getProp1()

于 2011-03-28T10:38:23.580 に答える