Modyfikatory dostępu

Modyfikatory dostępu w PHP

Potrafisz już zdefiniować klasę, wzbogacić ją o pola i metody, po czym utworzyć konkretny obiekt danej klasy.

Niestety, do tej pory wszystkie Twoje pola i metody były wystawione na zewnątrz. Każdy, kto chciał, mógł je zmieniać, modyfikować i nadawać wartości jakie tylko chciał.

Jest to sytuacja wielce niepożądana w codziennej pracy, szczególnie gdy nad jednym projektem pracuje wielu programistów. Chcesz zapewnić jak największą izolację Twoich wrażliwych części klasy od reszty kodu. Tylko wtedy tworzysz kod, którym da się w przyszłości zarządzać.

Pola publiczne

Do tej pory wszystkie pola i metody opisywaliśmy słowem kluczowym public.

Oznacza to, że dostęp do pola jest nieograniczony i każdy z dowolnego miejsca w kodzie może jego wartość zmieniać i odczytywać.

Dla szybkiego przypomnienia zobacz, jak wygląda klasa z publicznymi polami i metodami:

<?php
class Drzwi {
  public $wysokosc = 200;
  public $szerokosc = 80;
  public $czyZamkniete = true;

  public function otworz() {
    $this->czyZamkniete = false;
  }

  public function zamknij() {
    $this->czyZamkniete = true;
  }

  public function sprawdzCzyZamkniete() {
    return $this->czyZamkniete;
  }
}

Mając taki kod, każdy może przypisać dowolną wartość każdemu z pól. Ktoś może zmienić wewnętrzny stan obiektu (czy drzwi są zamknięte) nie wykonując operacji otwarcia ani zamknięcia drzwi. Z tego tytułu nasz program może nie działać prawidłowo.

<?php

$drzwi = new Drzwi();
$drzwi->zamknij();
$drzwi->czyZamkniete = false;
echo $drzwi->sprawdzCzyZamkniete() ? 'Drzwi zakmnięte' : 'Drzwi otwarte';
//wyświetli Drzwi otwarte
?>

Chociaż ostatnią operacją na obiekcie $drzwi było ich zamknięcie, bezpośrednia zmiana wewnętrznego stanu obiektu (jego pola) sprawiła, że drzwi są rozpoznawane jako otwarte bez wykonania akcji otworz().

Możemy temu zaradzić sprawiając, by zmienna czyZamkniete nie była dostępna do odczytu ani modyfikacji.

Pola prywatne

Osiągniemy zamierzony efekt, gdy oznaczymy pole jako prywatne. Wtedy jedynie obiekt danej klasy może odwoływać się bezpośrednio do prywatnego pola.

Wystarczy, że zmienimy jedną linijkę w definicji klasy:

<?php
class Drzwi {
  public $wysokosc = 200;
  public $szerokosc = 80;
  private $czyZamkniete = true;

  public function otworz() {
    $this->czyZamkniete = false;
  }

  public function zamknij() {
    $this->czyZamkniete = true;
  }

  public function sprawdzCzyZamkniete() {
    return $this->czyZamkniete;
  }
}

A wykonanie kodu z poprzedniego przykładu nie będzie możliwe:

<?php

$drzwi = new Drzwi();
$drzwi->zamknij();
$drzwi->czyZamkniete = false;
//tutaj interpreter zwróci błąd, gdyż nie ma dostępu do zmiennej

echo $drzwi->sprawdzCzyZamkniete() ? 'Drzwi zakmnięte' : 'Drzwi otwarte';

?>

Tak zatem pól prywatnych możesz używać jedynie wewnątrz definicji klasy. Próba dostępu z dowolnego innego miejsca skończy się wysypaniem skryptu.

Publiczne i prywatne metody

To samo tyczy się metod.

Jeśli zamiast słowa public zastosujesz private, danej metody będziesz mógł użyć jedynie wewnątrz definicji klasy.

Zobacz przykład:

<?php

class Samochod {
  private $iloscPaliwa = 40;
  private $spalanie = 5;

  private function obliczZasieg() {
    return $this->iloscPaliwa / $this->spalanie * 100;

  public function czyPrzejedzieTrase($dlugoscTrasy) {
    return $this->obliczZasieg() > $dlugoscTrasy ? 'TAK' : 'NIE';
  }
}

$samochod = new Samochod();
echo $samochod->czyPrzejedzieTrase(1000);
//wyświetli NIE

echo $samochod->czyPrzejedzieTrase(400);
//wyświetli TAK

echo $samochod->obliczZasieg()
// zwróci błąd dostępu

?>

Modyfikator Protected

Istnieje jeszcze trzeci modyfikator – protected.

Jeśli go zastosujesz, tylko klasa bazowa oraz wszystkie klasy dziedziczące będą miały dostęp do pola lub metody.

Tym sposobem płynnie przechodzimy do tematu dziedziczenia.

Dzięki tej lekcji potrafisz:

  • Ograniczać dostęp do pól klasy
  • Ograniczać dostęp do metod
  • Pozwalać klasie bazowej oraz klasom dziedziczącym na modyfikację pola lub metody

Teraz poznaj dziedziczenie.

Zapraszam!

Spis lekcji w programowaniu obiektowym

Poprzednia lekcja: Metody i właściwości Następna lekcja: Dziedziczenie