アクセス修飾子 〜public, protected, private〜

プログラミング

こんな人に読んでほしい

  • そもそもpublic, protected, privateって何?
  • それぞれの違いが説明できない
  • 違いを分かりやすく確認したい

早速見ていきましょ!!!


public

どこからでも呼び出し可能。

これが基礎的な呼び出し方で、分かりやすい。

メリット

実装者にとっては、どこからでも呼び出しやすく使いやすい。

デメリット

ファイル数が増えると、どこに記述されたメソッドか分かりにくい。

実際のコード
<?php
    class Test
    {
        public function public(){
            echo "public test";
        }
    }
    $test = new Test;

    // Testクラスのpublicメソッドを呼び出す
    $test->public();
?>

出力結果:public function


protected

クラス内からと継承クラスからは呼び出し可能。

メリット

うまく継承できれば、簡単に実装を行うことができる。

デメリット

複数のファイルで継承されると、どこが親のクラスかが分かりにくい。

実際のコード
<?php
    // 親クラス
    class TestParent
    {
        protected function protectedFunc(){
            echo "protected function";
        }
    }

    class TestChild extends TestParent
    {
        public function callTestParent() {
            TestParent::protectedFunc();
        }
    }

    // 親クラスで呼び出し
    $test_parearent = new TestParent;
    $test_parearent->protectedFunc();   // エラーになります

    // 子クラスで呼び出し
    $test_child = new TestChild();
    // ここでcallTestParentメソッドを呼び出し、親クラスを返す(※出力結果)
    $test_child->callTestParent();
?>

出力結果(17行目をコメントアウトした場合):protected function

17行目のエラー文

PHP Fatal error:  Uncaught Error: Call to protected method TestParent::protectedFunc() from global scope in /workspace/Main.php:17
Stack trace:
#0 {main}
  thrown in /workspace/Main.php on line 17

継承されていないので、エラーとなってしまう。


private

クラス内からのみ、呼び出し可能。

堅牢なシステム設計を行う為には、まずprivateにできないかを確認する。

メリット

クラス外から呼び出すことはできない為、保守性の高いコードが書ける。

デメリット

他のクラスから呼び出しができない為、使い勝手が悪い。

実際のコード
<?php
    class Test
    {
        private $test;
        
        public function __construct($test)
        {
            $this->test = $test;
        }
        
        public function testPublic(Test $call_private)
        {
            // publicからtestPrivateを呼び出す
            $call_private->testPrivate();
        }
        
        private function testPrivate()
        {
            echo "private function";
        }
    }
    
    $testInstance = new Test('test');
    $testInstance->testPrivate(new Test('other'));  // エラーになります

    // publicのtestPublicメソッドを呼び出す(※出力結果)
    $testInstance->testPublic(new Test('call_private'));
?>

出力結果(24行目をコメントアウトした場合):private function

24行目のエラー文

PHP Fatal error:  Uncaught Error: Call to private method Test::testPrivate() from global scope in /workspace/Main.php:24
Stack trace:
#0 {main}
  thrown in /workspace/Main.php on line 24

クラス外からTestクラスのtestPrivateメソッドを出力することはできない。


参考記事

継承は悪か?

まとめ

functionが使えるようになると楽になります。

また、使うものにもよりますが、コードの保守性も高まります。

コメント

タイトルとURLをコピーしました