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.
<?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.
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.
<?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.
- E-mail primite konstruktorom i provjerite format.
- Aktivaciju omogućite metodom activate().
- Ne dopustite izravnu promjenu privatnog stanja.
Za provjeru i nastavak