Trenutno stanje: PHP2Shell. Dvije kritične PHP ranjivosti (CVSS 9.2) omogućuju zlonamjerni kod bez prijave. Zakrpe od 21. 10. 2026.Što sada učiniti →

Objektno orijentirano programiranje u PHP-u

Moderne PHP aplikacije gotovo su uvijek objektno orijentirane. Ova stranica objašnjava gradivne elemente, novosti od PHP-a 8.0 do 8.4 i zašto magične metode imaju ulogu u sigurnosti.

Stanje 4 min čitanjaPHP znanje

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.

Izvori

Hitni kontakt

Svaki sat se računa. Pišite nam odmah.

Ukratko opišite sustav, verziju PHP-a i opažanje. Javit ćemo Vam se, razjasniti situaciju i raditi na daljinu dok incident nije zaključen i dokumentiran.

Hitna pomoć