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)
⚠️ Typowana właściwość bez wartości domyślnej musi być przypisana: Gdy deklarujesz typowaną właściwość bez wartości domyślnej (np. 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.
💡 Wartości domyślne właściwości: Możesz przypisać wartość domyślną przy deklaracji (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
⚠️ Nie mylić z :: Operator :: (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?

Jak w PHP tworzy się obiekt klasy Samochod?

Co oznacza $this wewnątrz metody?

Jakim operatorem odwołujesz się do właściwości lub metody obiektu?

Ć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ł