public, protected, privateを決める4ステップ

こんにちはーむちょこです。
今回は、アクセス修飾子public, protected, privateを使い分けるためにこういう順序で考えたらいいんじゃないかなーと思うことをご紹介させていただきます。
よかったらお付き合いください:)

アクセス権の種類

アクセス権とは、呼び出したり再定義することのできる権限です。

public, protected, privateのいずれかをプロパティやメソッド、定数に指定することでアクセス権を定義することができます。

MEMO

“アクセス権”についてのPHPの公式マニュアルはこちら

https://www.php.net/manual/ja/language.oop5.visibility.php

public

public 宣言されたプロパティ、メソッド、定数(今後はクラスのメンバと呼びます)はどこからでもアクセスが可能です。

publicのアクセス可能範囲

protected

protected宣言されたクラスのメンバは、そのクラス自身と親子関係にあるクラスのみアクセスが可能です。

protectedのアクセス可能範囲

private

private宣言されたクラスのメンバは、 そのクラス自身のみがアクセス可能です。

privateのアクセス可能範囲

まとめ

publicはどこからでも、protectedは自身と親子関係のクラス、privateは自身のみアクセスできます。

アクセス権

アクセス権の決め方

一見アクセス権の範囲が広ければ広いほど便利に見えますが、影響力の大きさから改変がしにくくなる不便さがあり、余計なアクセス権は想定外の場所の不具合を生む原因にもなりかねないため、できるだけ狭い範囲で作れるように考えていきましょう。

1. private

最も範囲が狭いのはprivateなので、privateをベースとして必要な分だけ広げていきます。

<?php
class MyClass
{
    private function foo()
    {
        // MyClass内から呼び出したい
    }

    private function bar()
    {
        $this->foo();
    }
}

2. protected

継承先、あるいは継承元で呼び出したり上書きしたい場合があります。

そのようなメンバにはprotected宣言をしてあげます。

<?php
class MyClass
{
    protected function foo()
    {
        // 継承先で呼び出したい
    }
}

class ChildClass extends MyClass
{
    private function bar()
    {
        $this->foo();
    }
}

3. public

そのクラスとは関係のない外部からアクセスしたいならpublicにします。

<?php
class MyClass
{
    public function foo()
    {
        // 外部から呼び出したい
    }
}

$myClass = new MyClass();
$myClass->foo();

4. 責務を確認

1~3の手順を行ったあともprivateのまま残っているメソッドは、クラス内の他のメソッドの処理をブロック分けしたものになるはずです。

処理をブロック分け

処理をブロック分けすることで可読性が上がるので、このこと自体は良いことです。

しかし、privateメソッドを多用することで、本来そのクラスの責務でないものを抱えてしまうことがあるので確認しておきましょう。

例えば、「privateメソッドのテストをしたい」「他のクラスにも似たようなメソッドがある」と感じたら、別のクラスのpublicメソッドとした方が良いかもしれません。

まとめ

privateから始めて必要な分だけ範囲を広げ、最後まで残ったprivateメソッドは責務を確認するようにすると、適切なアクセス権を見つけやすいと思います:)

他にもやり方はあると思うので、つよつよエンジニアさんからのご意見をお待ちしております!!!Twitterで@aya_lachelierにメンションつけていただけるとありがたいです。