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にアクセスできているように見えますが、実際にはアクセスしていません。
新しくプロパティを追加しているだけですが、アクセスしているように見えるので、混乱しました。
クラス内で宣言されていないプロパティにアクセスしようとしても、エラーにならない為でした。