2011-09-13 10 views
5

私の抽象的な親クラスには、そのサブクラスがすべての変数を反復することを可能にするメソッドを継承したいと思います。親、それ自身の変数です)。現時点でPHPの親関数はサブクラスのメンバーを見ることができません

私は親でこのメソッドを実装する場合は、親のみの変数が繰り返し処理されます。一方

class MyObject { 

    private $one; 
    private $two; 
    private $three; 

    function assignToMembers() { 
     $xx = 1; 
     foreach($this as $key => $value) { 
      echo "key: ".$key."<br />"; 
      $this->$key = $xx; 
      $xx++; 
     } 
    } 

    public function getOne() { 
     return $this->one; 
    } 

    public function getTwo() { 
     return $this->two; 
    } 

    public function getThree() { 
     return $this->three; 
    } 
} 


class MyObjectSubclass extends MyObject { 

    private $four; 
    private $five; 

    public function getFour() { 
     return $this->four; 
    } 

    public function getFive() { 
     return $this->five; 
    } 
} 
$o = new MyObjectSubclass(); 
$o->assignToMembers(); 
echo $o->getOne()." "; 
echo $o->getTwo()." "; 
echo $o->getThree()." "; 
echo $o->getFour()." "; 
echo $o->getFive()." "; 

// This prints 1 2 3 

を、私は置けばassignToMembersがサブクラスで機能する場合、サブクラスのメンバーだけが反復処理されます。

私のassignToMembers()関数をいくつかのサブクラスで使用できるようにするため、すべてのサブクラスでそれを実装する必要はありませんが、親クラスでのみ実装する必要はありませんそのクラスのメンバーにアクセスします。

これを達成する方法はありますか?

ありがとうございます。

答えて

5

説明したようにコードを動作させるには、protectedを使用する必要があります。アクセス/可視性修飾子の役割を忘れないでください:

  • private - クラスレベルのアクセスのみ
  • protected - 全体の継承チェーンアクセス
  • public - ユニバーサルアクセス
  • 問題のように見える
+0

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

3

が「保護された」ものをあなたの「プライベート」の定義を変更してみてください。

PHP Visibility

可視

プロパティまたはメソッドの可視性が保護またはプライベート、パブリックキーワードと 宣言を付けることによって定義することができます。クラス publicと宣言されたメンバーはどこにでもアクセスできます。 が保護されていると宣言されたメンバーは、クラスそのものと 継承されたクラスと親クラスによってのみアクセスできます。非公開として宣言されたメンバーは、メンバーを定義するクラスによってアクセスされるのは のみです。

+0

私は可視性が両方の方法で働いたことを認識していませんでした。 – Joe

関連する問題