GameCorder.net

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

php,public,protected,private

phpのpublic,protected,private修飾子の使い方です。
中でもprivateは要注意です。

php,public修飾子

classのプロパティには、修飾子をつけることができます。
publicをプロパティにつけるとどこからでもアクセスできるプロパティになります。

<?php

class Slime{
	public $life = 8;
}

$slime = new Slime();
echo $slime->life;

?>

実行結果

8
		

public修飾子をつけると、クラスからそのままアクセスすることができました

php,protected修飾子

次は、protected修飾子です。
protectedは、定義したクラスとその継承先のクラスで参照することができます。

<?php

class Monster{
	protected $life = 10;
}

// モンスタークラスを継承
class Slime extends Monster{
	public function show(){
		echo $this->life;
	}
}

$slime = new Slime();
//echo $slime->life;		// fatal error(protectedは直接アクセスできない)
$slime->show();				// protectedは継承先からアクセスが可能

実行結果

10
?>
        

publicとは違いクラスから直にアクセスできません。
クラスのメソッドから呼び出してアクセスする必要があります。
継承先からprotectedプロパティを呼び出しても、プロパティにアクセスすることができました。

php,private修飾子

最後にprivates修飾子です。
privateは定義したクラスのみで参照可能です。
ですが、勘違いする可能性があります。

<?php

class Monster{
	private $life = 10;
}

// モンスタークラスを継承
class Slime extends Monster{
	public function show(){
		echo $this->life;		// privateプロパティにアクセスしていない
	}
	
	public function set(){
		$this->life = 8;		// 親クラスのprivate $lifeに代入しているのではなく、新たにプロパティを追加している
	}
}

$slime = new Slime();
$slime->show();				// privateプロパティにはアクセスされない(errorは起きない)
$slime->set();				// Monsterクラスのprivateプロパティに代入されてるわけではない
$slime->show();				// slimeクラスのlifeプロパティを表示

実行結果

8

?>
		

setメソッドで、親クラスのlifeにアクセスできているように見えますが、実際にはアクセスしていません。
新しくプロパティを追加しているだけですが、アクセスしているように見えるので、混乱しました。
クラス内で宣言されていないプロパティにアクセスしようとしても、エラーにならない為でした。