Część 23 kursu PHP INF.03: Enkapsulacja i ochrona stanu obiektów. Modyfikatory public, private, protected, gettery i settery, właściwości readonly, dziedziczenie klas (extends), przesłanianie metod i parent:: oraz 16 pytań quizowych.
public oznacza dostęp z każdego miejsca, protected — z klasy i klas potomnych, a private — tylko z wnętrza tej klasy. Domyślnie właściwość jest publiczna, ale lepiej pisać to jawnie.
class Konto {
private $saldo = 0;
public function wplac($kwota) {
if ($kwota > 0) {
$this->saldo += $kwota;
}
}
public function saldo() {
return $this->saldo;
}
}
$k = new Konto();
$k->wplac(100);
echo $k->saldo();
class Konto {
private $saldo = 0;
public function wplac($kwota) {
if ($kwota > 0) {
$this->saldo += $kwota;
}
}
public function saldo() {
return $this->saldo;
}
}
$k = new Konto();
$k->wplac(100);
echo $k->saldo();
Co oznacza private?
Poprawna: d) Private zamyka dostęp do wnętrza klasy.
Gettery zwracają wartość właściwości, a settery ją ustawiają po sprawdzeniu poprawności. Dzięki temu można zmienić wewnętrzną reprezentację bez psucia kodu użytkowników klasy.
class Ocena {
private $wartosc = 1;
public function ustaw($wartosc) {
$wartosc = (int) $wartosc;
if ($wartosc >= 1 && $wartosc <= 6) {
$this->wartosc = $wartosc;
}
}
public function wartosc() {
return $this->wartosc;
}
}
class Ocena {
private $wartosc = 1;
public function ustaw($wartosc) {
$wartosc = (int) $wartosc;
if ($wartosc >= 1 && $wartosc <= 6) {
$this->wartosc = $wartosc;
}
}
public function wartosc() {
return $this->wartosc;
}
}
Co robi getter?
Poprawna: c) Getter tylko odczytuje właściwość.
Klasa potomna rozszerza bazową słowem extends i dziedziczy jej publiczne oraz chronione składowe. Dzięki temu nie trzeba pisać wspólnego kodu drugi raz.
class Osoba {
protected $imie;
public function __construct($imie) {
$this->imie = $imie;
}
public function przedstaw() {
return 'Jestem ' . $this->imie;
}
}
class Nauczyciel extends Osoba {
public function przedstaw() {
return parent::przedstaw() . ' i ucze.';
}
}
echo (new Nauczyciel('Pani Anna'))->przedstaw();
class Osoba {
protected $imie;
public function __construct($imie) {
$this->imie = $imie;
}
public function przedstaw() {
return 'Jestem ' . $this->imie;
}
}
class Nauczyciel extends Osoba {
public function przedstaw() {
return parent::przedstaw() . ' i ucze.';
}
}
echo (new Nauczyciel('Pani Anna'))->przedstaw();
Czym rozszerzamy klasę?
Poprawna: c) Extends tworzy klasę potomną.