0

継承ではなく構成を含む 2 つのクラスがあります。クラス A とクラス B です。クラス A のプロパティの 1 つは、クラス B オブジェクトの配列です。クラス A には public メソッドがありA::getName()ます。クラス B にも同じ名前の public メソッドがあります。クラス A のメソッドは次のとおりです。

public function getName()
{
    return $this->_name;
}

私の問題は、クラス B にいて、クラス A のこのパブリック メソッドにアクセスしようとすると、「保護されたプロパティにアクセスできません」というエラーが表示されることです。$_name各クラスの私有財産です。クラス A は、たとえばフォームの名前であり、B の場合はフィールドの名前です。

これは、エラーを生成するコードです (クラス B のコンストラクター)。

public function __construct($name)
{
    $this->foo = A::getName() .'-'. $name;
}

クラス A の public メソッド getName() にアクセスできないのはなぜですか? これを修正または回避する方法はありますか?


修理:

各オブジェクトには一意の名前があるため、各オブジェクトを個別に処理する必要がありますが、クラス A のメソッドを静的に呼び出していることに気付きました。私の問題を解決するために、クラス B に一意の名前のパブリック セット関数を指定し、それをクラス A で呼び出しました。

class A
{
    ...

    $this->list[$B_name] = new B($B_name);

    $this->list[$B_name]->setID($this->_name, $B_name);

}

class B
{
    ...

    public function setID($name, $subName)
    {
        $this->foo = $name .'-'. $subName;
}
4

1 に答える 1

1

これは、静的に呼び出そうとしていて、そのメソッドでインスタンス変数にアクセスしているためです。

これは次のように機能します。

class A {
   private static $_name = "A";
   public static function getName() {
        return self::$_name;
   }
}

class B {
   public function __construct($name) {
        $this->foo = A::getName() .'-'. $name;
   }
}

またはこのように(これはあなたの状況です)

class A {
   private $_name;

   public function __construct($name) {
        $this->_name = $name;
   }

   public function getName() {
       return $this->_name;
   }
}

class B {
   public function __construct($name, A $parent) {
        $this->foo = $parent->getName() .'-'. $name;
   }
}
于 2013-01-14T16:40:43.940 に答える