class Konto { public $numer; private $saldo; public function wplac($kwota) { if ($this->sprawdz($kwota)) $this->saldo += $kwota; } private function...
class Konto { public $numer; private $saldo; public function wplac($kwota) { if ($this->sprawdz($kwota)) $this->saldo += $kwota; } private function sprawdz($kwota) { return $kwota > 0; } }Które stwierdzenie najlepiej opisuje klasę Konto zdefiniowaną w języku PHP i przedstawioną na listingu?
Poprawne jest stwierdzenie, że klasa ma dwa pola i dwie metody, a metodę sprawdz() można wywołać tylko wewnątrz klasy. Pola to $numer i $saldo, metody - wplac() i sprawdz(). Modyfikator private przy metodzie oznacza, że wolno jej użyć tylko w kodzie tej klasy, np. przez $this->sprawdz($kwota) w metodzie wplac(). Wywołanie $konto->sprawdz(100) spoza klasy zakończy się błędem.
Do zapamiętania: metody pomocnicze, które są tylko częścią wewnętrznej logiki, oznacza się jako private, a na zewnątrz udostępnia się metody publiczne. Dzięki temu saldo zmienia się wyłącznie przez wplac(), które najpierw sprawdza kwotę - to praktyczny przykład hermetyzacji.
Analizując listing, łatwo pomylić się przy liczeniu albo przy modyfikatorach. Zmienna $kwota nie jest polem klasy, tylko parametrem metod, dlatego pól są dwa, a nie trzy. Metody są również dwie, więc opis „jedna metoda publiczna” pomija prywatną metodę sprawdz().
Pole $numer ma modyfikator public, a więc jest dostępne także spoza klasy - ograniczony dostęp ma pole $saldo. Odpowiedź z konstruktorem jest błędna podwójnie: w PHP konstruktor nazywa się __construct(), a w tej klasie takiej metody nie ma; poza tym nie wszystkie składowe są publiczne, bo $saldo i sprawdz() mają modyfikator private.
Bezpieczna metoda analizy: policz deklaracje zmiennych w ciele klasy (pola), policz słowa function (metody), a potem przy każdym elemencie odczytaj modyfikator dostępu. Parametry metod, takie jak $kwota, nie są polami, bo istnieją tylko podczas wywołania metody.