CZĘŚĆ 22 · PROGRAMOWANIE OBIEKTOWE (OOP)
Klasy, obiekty, właściwości i konstruktor
PPrezentacja dla nauczyciela
W programowaniu proceduralnym kod składa się z oddzielnych zmiennych i operujących na nich funkcji. W miarę rozrostu projektu taki podział prowadzi do chaosu i trudności w utrzymaniu logiki. Programowanie zorientowane obiektowo (OOP) łączy dane (stan) oraz operacje na nich (zachowanie) w spójne całości zwane obiektami.
Klasa to wzorzec lub schemat, na podstawie którego tworzy się konkretne egzemplarze (instancje) w pamięci. W tej części poznasz fundamenty OOP w PHP:
- Klasa a obiekt: Czym różni się definicja
class Samochodod konkretnego obiektu utworzonego operatoremnew. - Właściwości i metody: Jak deklarować pola przechowujące stan obiektu oraz funkcje wewnętrzne definiujące jego możliwości.
- Pseudozmienna
$thisi operator->:Jak wewnątrz metod odwoływać się do pól i metod bieżącej instancji (oraz dlaczego po strzałce nie podajemy znaku dolara). - Konstruktor
__construct():Magiczna metoda uruchamiana automatycznie w momencie tworzenia obiektu, służąca do wymuszenia podania niezbędnych danych początkowych. - Cykl życia obiektu i destruktor
__destruct():Moment zwalniania instancji z pamięci i porządkowanie zasobów. - Referencje a klonowanie: Dlaczego przypisanie
$b = $anie kopiuje obiektu oraz jak działa słowo kluczoweclone.
W emulowanym edytorze przeglądarkowym nie ma jeszcze pełnego środowiska wykonawczego dla obiektów PHP — dlatego zamiast ćwiczeń laboratoryjnych w Pracowni Web czeka na Ciebie 16 starannie opracowanych pytań quizowych, które gruntownie sprawdzą Twoją wiedzę i przygotują Cię do pytań teoretycznych na egzaminie zawodowym INF.03.
Klasa i obiekt
Klasa to przepis, a obiekt to konkretna rzecz zrobiona według tego przepisu. Klasę definiujemy słowem class, a obiekt tworzymy operatorem new.
W klasie umieszczamy właściwości (dane) i metody (funkcje). Do właściwości i metod obiektu odwołujemy się strzałką: $uczen->imie, $uczen->przedstaw().
Jeden przepis może opisywać wiele obiektów. Każdy obiekt ma własne wartości właściwości, mimo że korzysta z tych samych metod.
class Uczen {
public $imie;
public $punkty;
public function przedstaw() {
return $this->imie . ' ma ' . $this->punkty . ' pkt';
}
}
$ola = new Uczen();
$ola->imie = 'Ola';
$ola->punkty = 18;
echo $ola->przedstaw();
Właściwości i metody
Właściwości deklarujemy w klasie, najczęściej z modyfikatorem dostępu. Metody to funkcje w klasie; mają dostęp do właściwości przez $this, które oznacza „ten obiekt”.
Metoda może przyjmować parametry i zwracać wynik, tak jak zwykła funkcja. Dobrą praktyką jest jedna odpowiedzialność metody: albo liczy, albo wypisuje.
W klasie można też zdefiniować metodę __toString(), która pozwala wypisać obiekt przez echo. Bez niej PHP zgłosi błąd konwersji.
class Prostokat {
public $bokA;
public $bokB;
public function pole() {
return $this->bokA * $this->bokB;
}
public function obwod() {
return 2 * ($this->bokA + $this->bokB);
}
}
$p = new Prostokat();
$p->bokA = 4;
$p->bokB = 3;
echo 'Pole: ' . $p->pole() . ', obwod: ' . $p->obwod();
Konstruktor i destruktor
Konstruktor __construct() wykonuje się automatycznie przy tworzeniu obiektu. W nim ustawiamy wartości początkowe, żeby obiekt nigdy nie był „pusty”.
Parametry konstruktora podajemy w nawiasach przy new: new Uczen('Ola', 18). To wygodniejsze niż ustawianie każdej właściwości osobno.
Destruktor __destruct() wykonuje się przy usuwaniu obiektu. Rzadko jest potrzebny — zwykle wystarczy konstruktor i zwykłe metody.
class Uczen {
public $imie;
public $punkty;
public function __construct($imie, $punkty = 0) {
$this->imie = $imie;
$this->punkty = $punkty;
}
}
$ola = new Uczen('Ola', 18);
$jan = new Uczen('Jan');
echo $ola->imie . ' ' . $ola->punkty . ' / ' . $jan->punkty;
Ćwiczenia — Quiz wiedzy o programowaniu obiektowym (16 pytań)
Ze względu na ograniczenia przeglądarkowego środowiska laboratoryjnego ta część skupia się na gruntownej weryfikacji wiedzy teoretycznej i analizie kodu. Zaznacz prawidłowe odpowiedzi w poniższych 16 pytaniach, a następnie kliknij przycisk na dole strony, aby sprawdzić swoje wyniki i zapisać postęp w kursie.
Uzytkownik w PHP:
$produkt posiadający pole public $cena = 50;, który zapis poprawnie odczyta jego wartość?
<?php
class Towar {
public $cena = 50;
}
$produkt = new Towar();
?>
$this w metodach klasy PHP?
<?php
class Samochod {
public function __construct(string $marka) {
echo "Tworzę: " . $marka . " | ";
}
}
$s1 = new Samochod("Audi");
$s2 = new Samochod("BMW");
?>
<?php
class Uzytkownik {
public function __construct(public string $login, public int $wiek) {}
}
?>
__destruct()?
<?php
class Konto {
public int $saldo = 100;
}
$k1 = new Konto();
$k2 = new Konto();
$k1->saldo += 50;
echo $k1->saldo . " i " . $k2->saldo;
?>
<?php
class Gracz {
public int $punkty;
}
$g = new Gracz();
$g->punkty = ["złoto", "srebro"];
?>
<?php
class Klient {
public string $imie = 'Anna';
}
$k1 = new Klient();
$k2 = $k1;
$k2->imie = 'Ewa';
echo $k1->imie;
?>
<?php
class Adres {
public string $miasto = 'Warszawa';
}
$oryginal = new Adres();
$kopia = clone $oryginal;
$kopia->miasto = 'Kraków';
echo $oryginal->miasto;
?>
$a i $b w poniższym kodzie?
<?php
class Punkt {
public function __construct(public int $x, public int $y) {}
}
$a = new Punkt(10, 20);
$b = new Punkt(10, 20);
var_dump($a == $b);
var_dump($a === $b);
?>
<?php
class Osoba {
public function __construct(public string $imie, public string $nazwisko) {}
public function formatuj(): string {
return $this->nazwisko . " " . $this->imie[0] . ".";
}
}
$ludzie = [
new Osoba("Adam", "Kowalski"),
new Osoba("Bartosz", "Nowak")
];
foreach ($ludzie as $osoba) {
echo $osoba->formatuj() . " | ";
}
?>
$tytul w poniższym kodzie?
<?php
class Ksiazka {
public string $tytul;
}
$k = new Ksiazka();
echo $k->tytul;
?>
return $this; na końcu metody klasy?
<?php
class BuforTekstu {
private string $tekst = "";
public function dodaj(string $t): self {
$this->tekst .= $t;
return $this;
}
}
?>
zatankuj:
<?php
class Samolot {
public int $paliwo = 100;
public function zatankuj(int $litry): void {
$paliwo += $litry;
}
}
?>