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.
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
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.
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.
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.
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. 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.
- 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.