忍者ブログ

STEP UP BLOG

Home > ブログ > > [PR] Home > ブログ > php > privateの罠

privateの罠

最近ハマった挙動について書きます。
コードを見たほうが早いので以下にコード。
<?php

class ClassA
{
    private $member_variable = 'A';

    public function getMemberVariable()
    {
        return $this->member_variable;
    }
}

class ClassB extends ClassA
{
    private $member_variable = 'B';

    public function getMemberVariable()
    {
        return $this->member_variable;
    }
}

class ClassC extends ClassA
{
    private $member_variable = 'C';
}

$a = new ClassA();
$b = new ClassB();
$c = new ClassC();

echo $a->getMemberVariable()."\n";
echo $b->getMemberVariable()."\n";
echo $c->getMemberVariable()."\n";

$ php test.php 
A
B
A

$c->getMemberVariable()で"C"が返ってくると思ったら"A"でした。。
"C"を返すには以下のようにprivateをprotectedに変えるとできます。
<?php

class ClassA
{
    protected $member_variable = 'A';

    public function getMemberVariable()
    {
        return $this->member_variable;
    }
}

class ClassB extends ClassA
{
    protected $member_variable = 'B';

    public function getMemberVariable()
    {
        return $this->member_variable;
    }
}

class ClassC extends ClassA
{
    protected $member_variable = 'C';
}

$a = new ClassA();
$b = new ClassB();
$c = new ClassC();

echo $a->getMemberVariable()."\n";
echo $b->getMemberVariable()."\n";
echo $c->getMemberVariable()."\n";

$ php test.php 
A
B
C

子クラスから親クラスのメソッドを呼んで、そのメソッド内でprivate変数を呼ぶと親のprivate変数になるんですね。
理屈がわかればなるほどなんですが、どこがおかしいのか見つけるのが意外と難しかったです。。
PR

Comment0 Comment

Comment Form

  • お名前name
  • タイトルtitle
  • メールアドレスmail address
  • URLurl
  • コメントcomment
  • パスワードpassword

PAGE TOP