<?> PHP NOVA invictum.hr
Izdanje 2026.
Poglavlje 17

Klase i objekti

Povezujemo podatke i pravila u objekte koji štite vlastito valjano stanje i govore jezikom domene.

26 min čitanja Srednje razina PHP 8.5 ciljna verzija

Nakon ovog poglavlja

Što ćete znati napraviti

  • Definirati klasu, konstruktor, svojstva i metode.
  • Primijeniti enkapsulaciju umjesto javnog mijenjanja svega.
  • Razlikovati nasljeđivanje od sastavljanja objekata.

Model s ponašanjem

Klasa je nacrt, objekt konkretna vrijednost

Klasa definira koja svojstva i operacije pripadaju jednoj ideji. Konstruktor stvara valjan objekt. Promocija svojstava smanjuje ponavljanje, ali vidljivost i dalje treba birati namjerno.

Početak klase Article
<?php

declare(strict_types=1);

final class Article
{
    public function __construct(
        public readonly int $id,
        private string $title,
        private bool $published = false,
    ) {
        $this->rename($title);
    }

    public function title(): string
    {
        return $this->title;
    }

Zaštita stanja

Metoda provodi pravilo

Ako je svojstvo javno i promjenjivo, bilo koji dio programa može objekt staviti u nevaljano stanje. Privatno svojstvo i javna metoda omogućuju provjeru na jednom mjestu. Objekt ne mora imati getter i setter za svako polje; metode trebaju opisivati namjeru.

Ponašanje objekta
    public function rename(string $title): void
    {
        $title = trim($title);

        if ($title === '') {
            throw new InvalidArgumentException('Naslov je obavezan.');
        }

        $this->title = $title;
    }

    public function publish(): void
    {
        $this->published = true;
    }
}

Sastavljanje prije hijerarhije

Objekti surađuju kroz male ugovore

Nasljeđivanje stvara snažnu vezu „jest“, dok kompozicija spaja objekte odnosom „ima“. Servis za objavu može imati repozitorij i pošiljatelja obavijesti bez nasljeđivanja od njih. Interfejs opisuje što suradnik mora moći napraviti.

Mali ugovor
<?php

interface ArticleRepository
{
    public function save(Article $article): void;
}

final class PublishArticle
{
    public function __construct(
        private ArticleRepository $articles,
    ) {}
}

Primijenite naučeno

Vježba: Objekt korisničkog računa

Modelirajte račun koji ima e-mail adresu i stanje aktivacije.

  1. E-mail primite konstruktorom i provjerite format.
  2. Aktivaciju omogućite metodom activate().
  3. Ne dopustite izravnu promjenu privatnog stanja.

Za provjeru i nastavak

Službeni izvori