PHPのアクセス修飾子についてのまとめ


アクセス修飾子の種類と特徴

以下の図はそれぞれのアクセス修飾子を用いた場合、
自クラス・継承クラス(子クラス)・他クラスからアクセスできるかどうかを表したものである。

実際にコードを書いてみて検証する

自クラスからアクセス場合

<?php

class MyClass {
    public $test_01 = "パブリック"; 
    protected $test_02 = "プロテクト"; 
    private $test_03 = "プライベート";

    public function echoPublic() {
        echo $this->test_01;
    }
    public function echoProtected() {
        echo $this->test_02;
    }
    public function echoPrivate() {
        echo $this->test_03;
    }
}

$test = new MyClass;

$test->echoPublic();
echo "<br>";
$test->echoProtected();
echo "<br>";
$test->echoPrivate();

実行結果

パブリック
プロテクト
プライベート

→public,protected,privateすべてからアクセスできていることが確認できた

継承クラスからアクセスする場合

<?php

class MyClass {
    public $test_01 = "パブリック"; 
    protected $test_02 = "プロテクト"; 
    private $test_03 = "プライベート";

    public function echoPublic() {
        echo $this->test_01;
    }
    public function echoProtected() {
        echo $this->test_02;
    }
    public function echoPrivate() {
        echo $this->test_03;
    }
}

//継承クラス
class Children extends MyClass {

    public function echoPublic() {
        echo $this->test_01;
    }
    public function echoProtected() {
        echo $this->test_02;
    }
    public function echoPrivate() {
        echo $this->test_03;
    }
}

$test = new Children;

$test->echoPublic();
echo "<br>";
$test->echoProtected();
echo "<br>";
$test->echoPrivate();

実行結果

パブリック
プロテクト

Notice: Undefined property: Children::$test_03 in /Applications/MAMP/htdocs/practice/access.php on line 28

→public,protectedからアクセスできていることが確認でき、privateからはアクセスできずエラーになっていることがわかる

他クラスからアクセスする場合

<?php

class MyClass {
    public $test_01 = "パブリック"; 
    protected $test_02 = "プロテクト"; 
    private $test_03 = "プライベート";

    public function echoPublic() {
        echo $this->test_01;
    }
    public function echoProtected() {
        echo $this->test_02;
    }
    public function echoPrivate() {
        echo $this->test_03;
    }
}

class Other {

    //MyClass内の変数を使えるように、インスタンス化する
    function __construct()
    {
        $this->my_class = new MyClass;
    }
    public function echoPublic() {
        echo $this->my_class->test_01;
    }
    public function echoProtected() {
        echo $this->my_class->test_02;
    }
    public function echoPrivate() {
        echo $this->my_class->test_03;
    }
}

$test = new Other;

$test->echoPublic();
echo "<br>";
$test->echoProtected();
echo "<br>";
$test->echoPrivate();

実行結果

パブリック

Fatal error: Uncaught Error: Cannot access protected property MyClass::$test_02 in /Applications/MAMP/htdocs/practice/access.php:29 Stack trace: #0
 /Applications/MAMP/htdocs/practice/access.php(40): Other->echoProtected() #1 {main} thrown in /Applications/MAMP/htdocs/laravel_Udemy/access.php on line 29

→publicからアクセスできていることが確認でき、protected,privateからはアクセスできずエラーになっていることがわかる