PHP5クラスのプロパティ

December 23, 2008,
tags: php php5 アクセス修飾子


このエントリーをはてなブックマークに追加

PHP5を入れたので、早速クラスによる実験を。
PHP5から静的メソッドはstaticとつけたり、public private protectedなどのアクセス修飾子なんかも増えました。
かなりJavaライクな書き方になりました。

そこで、public private protectedのそれぞれのメンバ変数を使用して、extendsしたクラスでそれぞれのメンバ変数の値を変えたらどうなるかという実験しました。

ちなみに

public どこからでもアクセス可能(default)
protected 定義したのクラスと、サブクラスでアクセス可能
private 定義したのクラス内部でのみアクセス可能

test.php

<?php

class testA
{
    public $a = "a";
    protected $b = "b";
    private $c = "c";

    public function __construct()
    {
        print "testA class construct";
    }

    public function getC()
    {
        print $this->c;
    }
}

class testB extends testA
{
    public function __construct()
    {
        $this->a = "a_testB";
        $this->b = "b_testB";
        $this->c = "c_testB";
        print_r($this);
        $this->getC();
    }
  /* サンプル getCをオーバーライドしてみた。
    public function getC()
    {
        print $this->c;
    }
  */

}
$testB = new testB();
?>

ソースを見てのとおりですが、testAクラスのメンバ変数a,b,cをextendsしたtestBクラスから値を書き換えるというものです。
これの実行結果が面白かった。以下のようになりました。

test.php実行結果

testB Object ( [ a ] => a_testB [ b:protected ] => b_testB [ c ] => c [ c ] =>; c_testB )

なるほど、publicとprotectedに値を変更できるようです。

ただ、privateに関しては動作が若干違います。
エラーにはならないものの、c:privateってのとcっていうのが用意されてしまったみたいです。

ちなみに普通にtestBクラスで「print $this->c」ってやると「c_testB」が表示されてしまいます。
ただし、testAクラスで、プロパティcを表示するメソッドをかいておけば「c」と表示されるようです。
testBでオーバーライドしてそこのなかで「print $this->c」ってやると「c_testB」が表示されてしまいます。当たり前かw

ちょっとづつPHP5の機能を理解していこうと思います。

comments powered by Disqus