2008年04月07日

クラス変数についてよくわかってない件

クラス変数です。

class Hoe {
public static $class_var = 'Hoe';

public function get_self_class_var()
{
return self::$class_var; // -> 'Hoe'
}

//オーバーライド禁止
final public function get_self_class_var_no_extends()
{
return self::$class_var;
}
}

class Hoehoe extends Hoe {
//オーバーライド
public static $class_var = 'Hoehoe';

//オーバーライド
public function get_self_class_var()
{
return self::$class_var;
}

public function call_parent_get_self_class_var()
{
//親クラスのメソッドを呼ぶ
return parent::get_self_class_var();
}
}

の時、こんなになります。

echo Hoe::$class_var; // -> 'Hoe'
echo Hoehoe::$class_var; // -> 'Hoehoe'

$var_hoe = new Hoe();
$var_hoehoe = new Hoehoe();

echo $var_hoe->get_self_class_var(); // -> 'Hoe'
echo $var_hoehoe->get_self_class_var(); // -> 'Hoehoe'


これは、

echo $var_hoehoe->call_parent_get_self_class_var(); // -> 'Hoe'

親のメソッドの中で、self::$class_varを参照しているので、'Hoe'になります。

次のがわかってませんでした。

echo $var_hoehoe->get_self_class_var_no_extends(); // -> 'Hoe'

親クラスのメソッドをオーバーライドしていないと、親クラスのクラス変数を参照してしまうのですね!!
なんとなく、継承してるんだから子供のクラスのクラス変数を参照しそうな気がしてします。
気をつけないと。


これについて5.3.0から「遅延静的束縛(Late Static Binding = LSB)」というのが使えるようになるそうです。
ほーう。


マニュアルの「staticキーワード」のところに「PHP 5.3.0 以降では、変数を用いてクラスを参照することも可能です。」とあるのは

$class_name = 'Hoehoe';
echo $class_name::$class_var; // <- 'Hoehoe'

とか

echo $var_hoehoe::$class_var; // <- 'Hoehoe'

とできるという事です。
5.3.0より前だとエラーになってしまうので、こんなにしたりします。

$vars = get_class_vars('Hoehoe');
echo $vars['class_var'];

ちょいと面倒ですな。

posted by ほえ at 16:32| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.seesaa.jp/tb/92552463
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。