Klasy i obiekty
🎯 Po tej lekcji zdefiniujesz własną klasę z właściwościami i metodami oraz stworzysz jej obiekty słowem new.
Wyobraź sobie formularz podatkowy. Sam druk (pusty papier) opisuje, jakie pola należy wypełnić: imię, nazwisko, dochód, podatek. To jest klasa — projekt, przepis, szablon. Gdy wypełniasz druk swoimi danymi, tworzysz obiekt — konkretny egzemplarz wypełniony prawdziwymi wartościami. Możesz wydrukować tysiąc egzemplarzy tego samego formularza, każdy z innymi danymi.
Czym jest klasa?
Klasa to szablon definiujący:
- właściwości — dane, które każdy obiekt będzie przechowywać (jak pola w formularzu),
- metody — operacje, jakie obiekt potrafi wykonywać (jak
obliczPodatek()).
Klasę definiujesz słowem kluczowym class:
<?php
declare(strict_types=1);
class Samochod
{
public string $marka;
public string $model;
public int $rokProdukcji;
public function opisz(): string
{
return $this->marka . ' ' . $this->model . ' (' . $this->rokProdukcji . ')';
}
}
Klasa Samochod opisuje, że każdy samochód ma markę, model i rok produkcji, a potrafi się opisać przez metodę opisz().
Tworzenie obiektów — słowo new
Samą klasę możesz rozumieć jak schemat z katalogu. Żeby dostać prawdziwy samochód, musisz go wyprodukować — w PHP służy do tego słowo new:
<?php
declare(strict_types=1);
class Samochod
{
public string $marka;
public string $model;
public int $rokProdukcji;
public function opisz(): string
{
return $this->marka . ' ' . $this->model . ' (' . $this->rokProdukcji . ')';
}
}
$auto1 = new Samochod();
$auto1->marka = 'Fiat';
$auto1->model = '126p';
$auto1->rokProdukcji = 1973;
$auto2 = new Samochod();
$auto2->marka = 'Skoda';
$auto2->model = 'Octavia';
$auto2->rokProdukcji = 2021;
echo $auto1->opisz(); // wynik: Fiat 126p (1973)
echo $auto2->opisz(); // wynik: Skoda Octavia (2021)
Każde wywołanie new Samochod() tworzy nowy, niezależny obiekt. Zmiana $auto1->marka nie wpłynie na $auto2->marka.
Właściwości — dane obiektu
Właściwość to zmienna należąca do obiektu. Deklarujesz ją wewnątrz klasy z modyfikatorem widoczności (public, private, protected — o tym w następnych lekcjach) i opcjonalnym typem:
<?php
declare(strict_types=1);
class Ksiazka
{
public string $tytul;
public string $autor;
public float $cena;
public bool $dostepna = true; // wartość domyślna
}
$k = new Ksiazka();
$k->tytul = 'Pan Tadeusz';
$k->autor = 'Adam Mickiewicz';
$k->cena = 29.99;
echo $k->tytul; // wynik: Pan Tadeusz
echo $k->dostepna; // wynik: 1 (true jako int)
public string $tytul;), musisz ją przypisać zanim po raz pierwszy ją odczytasz — inaczej PHP wyrzuci błąd "must not be accessed before initialization". Następna lekcja (konstruktor) pokaże czysty sposób na inicjalizowanie takich właściwości przy tworzeniu obiektu.public bool $dostepna = true). Każdy nowy obiekt startuje z tą wartością, chyba że ją nadpiszesz.Metody — zachowanie obiektu
Metoda to funkcja zdefiniowana wewnątrz klasy. Może odczytywać i modyfikować właściwości obiektu, a także wykonywać dowolne obliczenia. Wewnątrz metody dostęp do właściwości bieżącego obiektu uzyskujesz przez $this:
<?php
declare(strict_types=1);
class KontoBankowe
{
public string $numer;
public float $saldo = 0.0;
public function wplac(float $kwota): void
{
$this->saldo += $kwota;
}
public function wyplac(float $kwota): void
{
$this->saldo -= $kwota;
}
public function pokazSaldo(): string
{
return 'Konto ' . $this->numer . ': ' . $this->saldo . ' zł';
}
}
$konto = new KontoBankowe();
$konto->numer = 'PL61109010140000071219812874';
$konto->wplac(1000.0);
$konto->wyplac(250.0);
echo $konto->pokazSaldo(); // wynik: Konto PL61109010140000071219812874: 750 zł
$this — odwołanie do bieżącego obiektu
$this to specjalna zmienna dostępna wewnątrz metod. Wskazuje na ten konkretny obiekt, na którym wywołano metodę. Dzięki temu ta sama metoda może działać na różnych obiektach:
<?php
declare(strict_types=1);
class Prostokat
{
public float $szerokosc;
public float $wysokosc;
public function pole(): float
{
return $this->szerokosc * $this->wysokosc;
}
public function obwod(): float
{
return 2 * ($this->szerokosc + $this->wysokosc);
}
}
$p1 = new Prostokat();
$p1->szerokosc = 4.0;
$p1->wysokosc = 3.0;
$p2 = new Prostokat();
$p2->szerokosc = 10.0;
$p2->wysokosc = 2.5;
echo $p1->pole(); // wynik: 12
echo $p2->pole(); // wynik: 25
echo $p1->obwod(); // wynik: 14
echo $p2->obwod(); // wynik: 25
Gdy wywołujesz $p1->pole(), wewnątrz metody $this oznacza $p1, więc obliczenie działa na wymiarach pierwszego prostokąta.
Operator ->
Operator -> (strzałka) to twoje okno do wnętrza obiektu. Używasz go zarówno do właściwości, jak i metod:
$obiekt->nazwaWlasciwosci // odczyt/zapis właściwości
$obiekt->nazwaMetody() // wywołanie metody
:: (podwójny dwukropek) służy do dostępu do składowych statycznych i metod klas (bez tworzenia obiektu) lub do wywołania parent:: w dziedziczeniu. Na codzień używasz -> na obiektach.Klasa vs obiekt — podsumowanie
| | Klasa | Obiekt |
|---|---|---|
| Co to jest | Szablon, projekt | Konkretna instancja |
| Ile ich jest | Jedna definicja | Może być wiele |
| Kiedy powstaje | Przy pisaniu kodu | W czasie działania (new) |
| Analogia | Przepis na ciasto | Upieczone ciasto |
W kolejnej lekcji dowiesz się, jak wygodnie inicjalizować właściwości przez konstruktor — metodę specjalną wykonywaną automatycznie przy new.
Sprawdź się
Czym jest klasa w PHP?
Klasa to szablon (przepis, projekt), który definiuje, jakie właściwości i metody będą miały obiekty danego typu. Sam obiekt (instancja) powstaje dopiero przez new.
Jak w PHP tworzy się obiekt klasy Samochod?
Słowo kluczowe new tworzy nową instancję klasy. new Samochod() wywoła konstruktor klasy Samochod i zwróci gotowy obiekt.
Co oznacza $this wewnątrz metody?
$this to specjalna zmienna wskazująca na bieżący obiekt. Przez $this->właściwość możesz odczytać lub ustawić dane konkretnej instancji, na której działa metoda.
Jakim operatorem odwołujesz się do właściwości lub metody obiektu?
Operator -> (strzałka) służy do dostępu do właściwości i metod na obiekcie: $samochod->marka lub $samochod->jedz(). Operator :: to operator zakresu statycznego.
Ćwiczenie
Zdefiniuj klasę Produkt z właściwościami: string $nazwa, float $cena, int $iloscNaMagazynie. Dodaj metodę wartoscMagazynu(): float, która zwraca cena * iloscNaMagazynie. Stwórz dwa obiekty Produkt i wyświetl wartość magazynu każdego z nich.
Pokaż rozwiązanie
<?php
declare(strict_types=1);
class Produkt
{
public string $nazwa;
public float $cena;
public int $iloscNaMagazynie;
public function wartoscMagazynu(): float
{
return $this->cena * $this->iloscNaMagazynie;
}
}
$jablka = new Produkt();
$jablka->nazwa = 'Jabłka';
$jablka->cena = 3.49;
$jablka->iloscNaMagazynie = 100;
$chleb = new Produkt();
$chleb->nazwa = 'Chleb';
$chleb->cena = 4.99;
$chleb->iloscNaMagazynie = 50;
echo $jablka->nazwa . ': ' . $jablka->wartoscMagazynu() . ' zł'; // wynik: Jabłka: 349 zł
echo $chleb->nazwa . ': ' . $chleb->wartoscMagazynu() . ' zł'; // wynik: Chleb: 249.5 zł