【PHP】public・protected・private 適当に決めてない?


突然ですが
メソッドの前につける public・protected・private
適当に決めている人いませんか?

はい、僕です。

「これはまぁどこからも呼ばない気がするし private でいいかな。。」
「うーんこれあとで他で使いそうだなぁ。。。いや微妙だなぁ。。。よしとりあえず protected にしとくかっ。」

はい、僕です。

ということで、今回は いわゆる アクセス修飾子 について、
「可読性」という視点から、改めて考えたいと思います。

まず、おさらいです。

public・・・どこからでもアクセス可能
private・・・継承先のサブクラスからアクセス可能
protected・・・そのクラスからのみアクセス可能

ですね。

それは知ってるんです。それはみんな知ってるんですよ!!
知ってるだけで使えないんだったら、なんの意味があるっていうんですか!!!

はぁはぁ。。。
何なんだこれは。。。

話は変わりますが、
『人生』には、どうやっても変えられないものと、変えることができるものがあります。
過去の偉人たちも言っています。

民よ。変えられない「過去」に嘆くのならば、変えられる「未来」を見ようではないか。
by ナポレオン

「他人」は変えることはできない。変えることができるとしたら、それは「自分」である。
by アドラー

相手の「変」なところを変えようとしないで、心で受け入れようよ。そしたらそれが「恋」に変わるからさ。
by 紫式部

すいません嘘です。ググっても出てきません。

そんな感じで、クラス設計をする際も、
変えることができる属性と、変えることができない属性を、
明確に定義しておいた方がいいですよね。

では『人生』ではなく「牛丼」で考えてみましょう。

◯屋の牛丼を頼み、カウンターに置かれました。
この時点で、変えることができるものと、変えることができないものって何でしょう?

「牛丼を食す上で変えられないもの」
・ごはんの量
・値段

「牛丼を食す上で変えることができるもの」
・紅生姜の量
・お箸で食べるか、スプーンで食べるか

GyuDon.php
class GyuDon {
    private $riceAmount = 200; // ごはんの量
    private $price = 350; // 値段
    public $beniSyoga = '3袋'; // 紅生姜の量
    public $useChopsticks = true; // お箸を使う
}

変えることができないものというのは、
変えようとすると怒られます。

ごはんの量を変えてみましょう。

main.php
$gyudon = new GyuDon();

$gyudon->riceAmount = 300; // エラーが起きる

みなさん想像してみてください、牛丼が出されたあとに、
やっぱりご飯を大盛りにしてくれと頼んだら、確実に嫌な顔をされますよね。

次に、紅生姜の量を増やしてみようと思います。

main.php
$gyudon = new GyuDon();

$gyudon->beniSyoga = '10袋'; // エラーは起きない

はい、紅生姜をいくら盛ろうが、誰にも怒れませんね。

最後に

private・protected・public を なんとなくではなく、
変えることができるものと、変えることができないもの、という観点で決めるようにすると、
よりオブジェクト指向を深く理解できるのではないでしょうか。

それでは、みなさん、紅生姜は常識の範囲内でね