# Objektno orijentirano programiranje u PHP-u

> Objektno orijentirani PHP: klase, sučelja, traitovi i enumi, nova jezična sredstva od PHP-a 8.0 do 8.4 te veza s deserijalizacijom i sigurnošću.

Izvor: https://phpsos.de/hr/php/objektorientierung/  
Stanje: 25.10.2026  
Pružatelj: PHP SOS, PHP hitna pomoć i sigurnost poslužitelja. Hitna pomoć putem WhatsAppa: https://wa.me/491736494914?text=Pozdrav%20PHP%20SOS%2C%20trebamo%20pomo%C4%87%20s%20na%C5%A1im%20PHP%20poslu%C5%BEiteljem.%20Tvrtka%3A%20%E2%80%A6%20Web-stranica%3A%20%E2%80%A6

**Ukratko:** Objektno orijentirano programiranje (OOP) povezuje podatke i pripadne funkcije u klase. PHP za to nudi klase, apstraktne klase, sučelja, traitove i, od PHP-a 8.1, enume. S PHP-om 8.0 do 8.4 dodano je mnogo jezičnih sredstava, primjerice promocija konstruktora, `readonly`, property hooks i asimetrična vidljivost. Za sigurnost je važno: dobro enkapsulirani kod lakše se provjerava, a magične metode čine nesigurnu deserijalizaciju opasnom. Protiv ranjivosti u interpreteru poput PHP2Shella OOP ne pomaže.

## Što objektno orijentirano programiranje znači u PHP-u

Umjesto labavih funkcija i globalnih varijabli, klasa opisuje jedan pojam iz struke: narudžbu, kupca, račun. Određuje koji podaci joj pripadaju (svojstva) i što se s njima može činiti (metode). Objekt je konkretan primjerak te klase.

Za donositelje odluka to ima praktičnu vrijednost: objektno orijentirani kod s jasnim klasama lakše se testira, provjerava i predaje pružateljima usluga. Stare PHP aplikacije od mnogo pojedinačnih skripti s globalnim varijablama, naprotiv, teško se održavaju i sklone su pogreškama pri nadogradnjama.

Središnja je ideja enkapsulacija: klasa prema van otvara samo metode koje drugi doista trebaju i štiti svoje unutarnje stanje. Narudžba se tada, primjerice, može označiti kao plaćena samo metodom koja prethodno provjerava je li to uopće dopušteno. Takva pravila okupljena na jednom mjestu dobitak su i za sigurnost.

## Gradivni elementi u pregledu

| Element | Svrha | Kratak primjer |
|---|---|---|
| Klasa | nacrt za objekte sa svojstvima i metodama | `class Rechnung { ... }` |
| apstraktna klasa | zajednička osnova, ne može se izravno instancirati | `abstract class Zahlart { ... }` |
| Sučelje | ugovor: koje metode klasa mora nuditi | `interface Versandfaehig { ... }` |
| Trait | metode za višekratnu uporabu za klase bez zajedničke roditeljske klase | `trait MitZeitstempel { ... }` |
| Enum | fiksni skup dopuštenih vrijednosti kao vlastiti tip, od PHP-a 8.1 | `enum Status { case Offen; ... }` |

Vidljivosti (`public`, `protected`, `private`) reguliraju tko smije pristupati svojstvima i metodama. Klase se organiziraju u namespaceove i učitavaju putem autoloadera; kako to funkcionira, prikazuje stranica [Namespaceovi i autoloading](https://phpsos.de/hr/php/namespaces-autoloading/).

## Moderni PHP: novosti od 8.0 do 8.4

Sljedeća jezična sredstva dokumentirana su u PHP priručniku odnosno u najavama izdanja:

| Verzija | Novost |
|---|---|
| 8.0 | promocija konstruktora, nullsafe operator `?->`, `::class` na objektima |
| 8.1 | `readonly` svojstva, enumi, `new` u inicijalizatorima, `final` za konstante klasa |
| 8.2 | `readonly` klase; dinamička svojstva smatraju se zastarjelima |
| 8.3 | atribut `#[\Override]`, tipizirane konstante klasa |
| 8.4 | property hooks, asimetrična vidljivost, `new` bez zagrada koje ga okružuju |

Primjer koji kombinira nekoliko tih sredstava:

```php
<?php
declare(strict_types=1);

enum Status: string
{
    case Offen = 'offen';
    case Bezahlt = 'bezahlt';
}

final class Bestellung
{
    public function __construct(
        public readonly int $id,
        public private(set) Status $status = Status::Offen,  // od PHP-a 8.4
    ) {}

    public function alsBezahltMarkieren(): void
    {
        $this->status = Status::Bezahlt;
    }
}

$b = new Bestellung(42);
$b->alsBezahltMarkieren();
echo $b->status->value;              // bezahlt
$s = Status::tryFrom('storniert');   // null umjesto pogreške
```

`readonly` sprječava izmjenu ID-a nakon stvaranja. `private(set)` dopušta čitanje izvana, ali pisanje samo unutar klase. Takva jamstva u kodu smanjuju vjerojatnost pogrešaka koje bi se inače uočile tek u radu. Tipove iza toga objašnjava stranica [Sustav tipova u PHP-u](https://phpsos.de/hr/php/typsystem/).

### Zamke nadogradnje u objektno orijentiranom kodu

Za starije su aplikacije posebno važne dvije promjene. Od PHP-a 8.2.0 stvaranje dinamičkih svojstava, dakle svojstava koja nisu deklarirana u klasi, zastarjelo je, osim ako klasa nosi atribut `#[\AllowDynamicProperties]`. Stariji kod to često koristi nesvjesno i zapisnike tada puni napomenama. Osim toga, prema priručniku tipizirana svojstva moraju biti inicijalizirana prije prvog čitanja, inače PHP baca `Error`.

Koristan je atribut `#[\Override]` iz PHP-a 8.3: označava metodu kao nadjačavanje roditeljske metode. Ako te metode više nema, primjerice nakon preimenovanja u biblioteci, PHP javlja pogrešku umjesto da metodu tiho pusti u prazno. Takve provjere nadogradnje čine predvidljivijima; kod zaglavljenih starih projekata pomaže naša [migracija na podržanu verziju PHP-a](https://phpsos.de/hr/leistungen/php-migration-legacy/).

## Objekti i memorija

Objekti se u PHP-u prosljeđuju putem oznaka (handleova). Ako se objekt preda funkciji, ona radi s istim objektom, a ne s kopijom. To je učinkovito, ali lako vodi do kružnih referenci, primjerice kad narudžba poznaje svoje stavke, a svaka stavka opet svoju narudžbu. Takve cikluse samo brojanje referenci ne čisti; za to PHP ima vlastiti garbage collector. Pojedinosti su na stranici [Upravljanje memorijom u PHP-u](https://phpsos.de/hr/php/speicherverwaltung/).

## OOP i sigurnost: magične metode i deserijalizacija

PHP poznaje magične metode koje se pozivaju automatski, primjerice `__construct`, `__destruct`, `__toString`, `__get` ili `__wakeup`. To je praktično, ali ima i tamnu stranu: ako aplikacija strane podatke pomoću `unserialize()` pretvara natrag u objekte, napadač može odrediti koje klase nastaju i time pokrenuti postojeći kod u magičnim metodama. Kako to spriječiti, opisuje vodič [Nesigurna deserijalizacija u PHP-u](https://phpsos.de/hr/ratgeber/deserialisierung-php/). Ukratko: za razmjenu podataka koristite `json_encode()` i `json_decode()`, a `unserialize()` samo za vlastite, pouzdane podatke, idealno s opcijom `allowed_classes`.

Kod PHP2Shella dobar objektno orijentirani kod, naprotiv, ne pomaže. CVE-2026-109618 i CVE-2026-109619 nalaze se u interpreteru, a kod mod_php-a je prema PHP timu pokazan exploit prije nego što se izvrši kod aplikacije. Obvezni su ažuriranje na PHP 8.5.12, 8.4.27, 8.3.36 ili 8.2.35 i ponovno pokretanje svih PHP procesa.

## Kako PHP SOS konkretno pomaže?

- Procjenjujemo strukturu Vaše aplikacije i pokazujemo koji dijelovi otežavaju nadogradnju na podržanu verziju PHP-a.
- Ciljano tražimo rizične obrasce poput `unserialize()` nad stranim podacima i opasne magične metode.
- Vlastite razvoje provjeravamo u okviru [sigurnosnog audita i penetracijskog testa](https://phpsos.de/hr/leistungen/sicherheitsaudit-penetrationstest/).
- Instaliramo PHP ažuriranje, ponovno pokrećemo sve workere i nakon toga testiramo aplikaciju.


## Česta pitanja

**Je li PHP objektno orijentirani jezik?**  
PHP podržava i proceduralni i objektno orijentirani kod. Frameworci, jezgre CMS-ova i shop sustavi danas su ipak pretežno objektno orijentirani, s klasama, sučeljima i namespaceovima.

**Koja je razlika između sučelja i apstraktne klase?**  
Sučelje samo opisuje koje metode klasa mora nuditi. Apstraktna klasa uz to može već sadržavati kod i svojstva, ali se ne može izravno instancirati. Klasa može imati više sučelja, ali samo jednu roditeljsku klasu.

**Otkad u PHP-u postoje enumi?**  
Enumeracije su stigle s PHP-om 8.1. Zamjenjuju zbirke konstanti vlastitim tipom koji dopušta samo definirane slučajeve. Backed enumi dodatno imaju vrijednost tipa int ili string.

**Zašto su magične metode važne za sigurnost?**  
Metode poput __destruct ili __wakeup PHP poziva automatski, primjerice pri deserijalizaciji podataka. Ako strani podaci neprovjereno dospiju u unserialize(), to može pokrenuti neočekivane tijekove u postojećim klasama.

## Izvori

- [PHP priručnik: Klase i objekti, osnove](https://www.php.net/manual/de/language.oop5.basic.php)
- [PHP priručnik: Svojstva](https://www.php.net/manual/en/language.oop5.properties.php)
- [PHP priručnik: Vidljivost](https://www.php.net/manual/en/language.oop5.visibility.php)
- [Izdanje PHP-a 8.1](https://www.php.net/releases/8.1/en.php)
