こんにちは!独学プログラマー&ライターのつぶらやです。
phpを始めたばかりの頃。
$がついているのが変数。
functionではじまり{}で囲まれているかたまりが、関数だとわかり始めた時。
私はこんな疑問を持ちました。
・変数の$やfunctionの前についてるprotectedとか、privateってなんだろう
今回は、phpを始めたばかりの人ならまず疑問に思う、functionの前についているprotectedなどのアクセス修飾子について説明していきます。
実は、あまり理解していなくても動いたりするのですが、疑問に思いここに辿り着いてくださった今こそ!覚えておいて頂きたいと思います。
なんで権限って必要なの?
変数やfunctionの前についているprotectedなどを、アクセス修飾子と呼びます。
アクセス修飾子をつける事で、その関数にアクセスできる権限(アクセス権限)を設定することが出来ます。
それでは、なぜアクセス権限は必要なのでしょうか。
その理由について解説します。
変数名や関数名の上書きを防ぐ
テストプログラムで結果がどうなるか見ていきましょう。
アクセス修飾子の種類は後ほど説明しますが、今回使用しているpublicは、どこからでもアクセス可能という一番広い範囲のアクセス修飾子です。
overlapFuncBaseをAさんが開発して、BさんがoverlapFuncBaseを継承してoverlapFuncを作成した例だとします。
継承とはそのクラス内にはない関数やと変数を受け継いで、クラス内で使用出来るようにする事です。
継承の参考サイト↓
<?php class overlapFuncBase { public $s = 1; } class overlapFunc extends overlapFuncBase { public $s = 2; } $obj_overlap = new overlapFunc(); var_dump($obj_overlap);
結果
object(overlapFunc)#1 (1) { ["s":"overlapFunc":public] => int(2) }
BさんはoverlapFuncの中で、Aさんが作成したoverlapFuncBaseを使用できるようにしたのに、$sという変数名が同じだったため上書き(オーバーライド)されてしまいました。
そこで、アクセス修飾子の出番です。
<?php class overlapFuncBase { private $s = 1; } class overlapFunc extends overlapFuncBase { private $s = 2; } $obj_overlap = new overlapFunc(); var_dump($obj_overlap);
結果
object(overlapFunc)#1 (2) { ["s":"overlapFunc":private] => int(2) ["s":"overlapFuncBase":private] => int(1) }
初めのコードとの違いは、変数$sの前のアクセス修飾子publicをprivateに変更したことです。
privateは、自分のクラス内しかアクセスできません。
結果、AさんBさんそれぞれが作成したクラス毎に、同じ変数名であっても、違う結果を持つことが出来るようになりました。
今回の例では、変数を表示させるだけでしたが、計算に使っていた場合などはどうでしょう。
計算結果が違ってきます。それは大きな問題です。
また、AさんとBさんが同じ変数を使わなければいい話!と思うかもしれませんが、現場の開発では、AさんBさんが机を並べて開発しているわけではない場合もあります。
自分の開発しているクラス内でのみ有効な範囲を設定する事で、予期せぬバグを防ぐという効果があるのです。
どんな種類があるの?
続いて、アクセス修飾子の種類についてお話します。
以下の表を確認してください。
各アクセス修飾子がどこの範囲に対応しているかを示す表です。
[su_table]
アクセス修飾子 | クラス内 | 継承したクラス | クラス外 |
private | 〇 | × | × |
protected | 〇 | 〇 | × |
public | 〇 | 〇 | 〇 |
[/su_table]
以下の順に範囲が大きくなります。
private → protected → public
もう一つ、staticという特別なアクセス修飾子があります。
クラス名を指定すれば、どこからでも使用できるものなのですが、少し特殊なので今回は説明を省きますね。
気になる方は以下の参考サイトをご覧ください。
staticの参考サイト↓
結局、どれを使ったらよいの?
さて、そろそろアクセス修飾子という単語にも慣れてきていただけましたでしょうか。
最後に、結局どれを使用したらよいのかというお話をさせて頂きたいと思います。
それは、privateです。
一番範囲が狭いので、呼び出されても上書きされることがないからです。
なんで権限って必要なの?の項目でもお話しましたが、一番安全性が高い範囲設定です。
継承されるクラスなどは特に、外部から呼び出されて上書きされないようになるべくprivateを使用するのがおすすめです。
まとめ
今回は、phpのprotectedなどのアクセス修飾子について解説しました。
すべてpublicで書かれてあっても問題なく動く場合が殆どのため、コードを書く時に意識をしない方もいるかもしれません。
しかし、こういった基礎のを理解していないとつまづく時がいつか来ると思います。
学習始めた頃にしっかりと覚えておきたいですね。
それではまた。