Modyfikatory dostępu w klasie - niejasna sytuacja

0

Cześć,

uczę się PHP i mam pewną niejasną sytuację odnośnie modyfikatorów dostępu. Otóż mam taki oto kod:

<!doctype html>
<html>
    <head>
    </head>

    <body>
        <?php
        /*
                Modyfikator dostępu musi wystapić przed każdym polem w klasie, nie musi być użyty natomiast przed każdą metodą.
            Gdy nie ma modyfikatora dostępu przed metodą, oznacza to że jest ona publiczna (czyli tak samo jakby użyto
            modyfikatora public). Znaczenie modyfikatorów:
            - public: oznacza, że pole/metoda jest publiczne, czyli dostępne w pozostałych klasach
            - protected: oznacza, że pole/metoda jest chronione, czyli dostępne jest w zakresie tylko swojej klasy oraz klas
                         bazowych/pochodnych
            - private: oznacza, że pole/metoda jest dostępne tylko w obrębie klasy, w której jest zdefiniowane
        */
            class A
            {
                public $zmienna1 = 10;
                protected $zmienna2 = 20;
                private $zmienna3 = 30;

                public function wyswietl()
                {
                    echo("Klasa A->Zmienna 1 (public): $this->zmienna1.<br>");
                    echo("Klasa A->Zmienna 2 (protected): $this->zmienna2.<br>");
                    echo("Klasa A->Zmienna 3 (private): $this->zmienna3.<br>");
                }
            }

            class B extends A
            {
                public function wyswietl()
                {
                    echo("Klasa B->Zmienna 1 (public): $this->zmienna1.<br>");
                    echo("Klasa B->Zmienna 2 (protected): $this->zmienna2.<br>");
                    echo("Klasa B->Zmienna 3 (private): $this->zmienna3.<br>");
                }
            }

            $objA = new A();
            $objB = new B();

            echo("Zawartość obiektu \$objA: <br>");
            echo($objA->zmienna1."<br>");
            echo($objA->zmienna2."<br>");
            echo($objA->zmienna3."<br>");
            $objA->wyswietl();

            echo("<br>Zawartosc obiektu \$objB: <br>");
            $objB->wyswietl();
        ?>
    </body>    
</html>

Wynikiem działania tego kodu jest:

Zawartość obiektu $objA:
10

Dlaczego:

  • nie działa kod z linijki 26, 27 i 48 skoro zgodnie z definicją modyfikator protected oraz private został użyty w klasie bazowej
  • nie działa kod z linijki 45 i 46, skoro klasa potomna zgodnie z definicją ma dostęp do pól public i protected klasy bazowej?

Pozdrawiam!

4

W dużym skrócie:
linie 46 i 47 - próbujesz uzyskać dostęp do protected z zakresu public (poza klasą)
linia 37 - klasa B nie ma dostępu do właściwości/metod typu private z klas, po których dziedziczy

Wszystko masz pięknie opisane nad klasą A

1
 /*
                Modyfikator dostępu musi wystapić przed każdym polem w klasie, nie musi być użyty natomiast przed każdą metodą.

To jest nie prawda, przed polem też nie musi wystąpić modyfikator dostępu, np:

class MojaKlasa {
  var $mojePole = 2;
}

I tak samo jak z funkcjami, pole bez modyfikatora też jest domyślnie public.

1 użytkowników online, w tym zalogowanych: 0, gości: 1