Situația actuală: PHP2Shell. Două vulnerabilități critice PHP (CVSS 9.2) permit cod malițios fără autentificare. Patchuri din 21.10.2026.Ce este de făcut acum →

Programarea orientată pe obiecte în PHP

Aplicațiile PHP moderne sunt aproape întotdeauna orientate pe obiecte. Pagina explică elementele de bază, noutățile de la PHP 8.0 la 8.4 și de ce metodele magice contează pentru securitate.

Stadiu 5 min de cititCunoștințe PHP

Pe scurt: Programarea orientată pe obiecte (OOP) grupează datele și funcțiile aferente în clase. PHP oferă pentru aceasta clase, clase abstracte, interfețe, trait-uri și, din PHP 8.1, enum-uri. Cu PHP 8.0 până la 8.4 au apărut multe mijloace noi ale limbajului, precum promovarea în constructor, readonly, property hooks și vizibilitatea asimetrică. Important pentru securitate: codul bine încapsulat este mai ușor de verificat, iar metodele magice fac periculoasă deserializarea nesigură. Împotriva vulnerabilităților din interpretor, precum PHP2Shell, OOP nu ajută.

Ce înseamnă programarea orientată pe obiecte în PHP

În loc să folosească funcții izolate și variabile globale, o clasă descrie un element al domeniului de activitate: o comandă, un client, o factură. Ea stabilește ce date îi aparțin (proprietăți) și ce se poate face cu ele (metode). Un obiect este un exemplar concret al acelei clase.

Pentru factorii de decizie, aceasta are o valoare practică: codul orientat pe obiecte, cu clase clare, poate fi mai bine testat, verificat și predat unor prestatori. Aplicațiile PHP vechi, formate din multe scripturi separate cu variabile globale, sunt în schimb greu de întreținut și predispuse la erori la upgrade-uri.

O idee centrală este încapsularea: o clasă expune în exterior doar metodele de care ceilalți au cu adevărat nevoie și își protejează starea internă. O comandă poate fi atunci marcată ca plătită, de exemplu, doar printr-o metodă care verifică mai întâi dacă acest lucru este permis. Concentrarea unor astfel de reguli într-un singur loc este un câștig și pentru securitate.

Elementele de bază, pe scurt

Element Scop Exemplu scurt
Clasă plan de construcție pentru obiecte, cu proprietăți și metode class Rechnung { ... }
clasă abstractă bază comună, care nu poate fi instanțiată direct abstract class Zahlart { ... }
Interfață contract: ce metode trebuie să ofere o clasă interface Versandfaehig { ... }
Trait metode reutilizabile pentru clase fără clasă părinte comună trait MitZeitstempel { ... }
Enum set fix de valori permise, ca tip propriu, din PHP 8.1 enum Status { case Offen; ... }

Nivelurile de vizibilitate (public, protected, private) reglează cine poate accesa proprietățile și metodele. Clasele sunt organizate în namespace-uri și încărcate printr-un autoloader; cum funcționează aceasta arată pagina Namespace-uri și autoloading.

PHP modern: noutățile de la 8.0 la 8.4

Mijloacele de limbaj următoare sunt documentate în manualul PHP, respectiv în anunțurile de lansare:

Versiune Noutate
8.0 promovarea în constructor, operatorul nullsafe ?->, ::class pe obiecte
8.1 proprietăți readonly, enum-uri, new în inițializatori, final pentru constantele de clasă
8.2 clase readonly; proprietățile dinamice sunt considerate depășite
8.3 atributul #[\Override], constante de clasă tipizate
8.4 property hooks, vizibilitate asimetrică, new fără paranteze de încadrare

Un exemplu care combină mai multe dintre aceste mijloace:

<?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,  // din PHP 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 în loc de eroare

readonly împiedică modificarea ID-ului după creare. private(set) permite citirea din exterior, dar scrierea doar în interiorul clasei. Asemenea garanții din cod fac mai puțin probabile erorile care altfel ies la iveală abia în exploatare. Tipurile din spate le explică pagina Sistemul de tipuri al PHP.

Capcane de upgrade în codul orientat pe obiecte

Pentru aplicațiile mai vechi, două modificări sunt deosebit de relevante. Din PHP 8.2.0, crearea de proprietăți dinamice, adică a proprietăților care nu sunt declarate în clasă, este depășită, cu excepția cazului în care clasa poartă atributul #[\AllowDynamicProperties]. Codul mai vechi folosește adesea acest lucru fără să-și dea seama și umple apoi logurile cu notificări. În plus, proprietățile tipizate trebuie, potrivit manualului, să fie inițializate înainte de prima citire, altfel PHP aruncă un Error.

Util este atributul #[\Override] din PHP 8.3: el marchează o metodă drept suprascriere a unei metode părinte. Dacă această metodă nu mai există, de exemplu după o redenumire într-o bibliotecă, PHP raportează o eroare, în loc să lase metoda să ruleze pe tăcute în gol. Asemenea verificări fac upgrade-urile mai previzibile; la proiectele vechi blocate, ne ajută migrarea la o versiune PHP acceptată.

Obiecte și memorie

În PHP, obiectele sunt transmise prin identificatori (handles). Dacă se transmite un obiect unei funcții, aceasta lucrează cu același obiect, nu cu o copie. Este eficient, dar duce ușor la referințe circulare, de exemplu atunci când o comandă își cunoaște pozițiile, iar fiecare poziție își cunoaște din nou comanda. Asemenea cicluri nu sunt curățate de numărarea referințelor singură; pentru aceasta PHP are un garbage collector propriu. Detalii se găsesc pe pagina Gestionarea memoriei în PHP.

OOP și securitate: metode magice și deserializare

PHP cunoaște metode magice, apelate automat, precum __construct, __destruct, __toString, __get sau __wakeup. Este practic, dar are și o latură întunecată: dacă o aplicație transformă date străine înapoi în obiecte cu unserialize(), un atacator poate stabili ce clase iau naștere și poate declanșa astfel cod existent din metodele magice. Cum se previne aceasta descrie ghidul Deserializarea nesigură în PHP. Pe scurt: pentru schimbul de date folosiți json_encode() și json_decode(), iar unserialize() doar pentru date proprii, de încredere, ideal cu opțiunea allowed_classes.

La PHP2Shell, în schimb, codul bun orientat pe obiecte nu ajută. CVE-2026-109618 și CVE-2026-109619 se află în interpretor, iar la mod_php a fost demonstrat, potrivit echipei PHP, un exploit înainte ca vreun cod al aplicației să ruleze. Obligatorii sunt actualizarea la PHP 8.5.12, 8.4.27, 8.3.36 sau 8.2.35 și repornirea tuturor proceselor PHP.

Cum ajută PHP SOS concret?

  • Evaluăm structura aplicației dumneavoastră și arătăm ce părți îngreunează un upgrade la o versiune PHP acceptată.
  • Căutăm țintit tipare riscante, precum unserialize() pe date străine și metode magice periculoase.
  • Verificăm dezvoltările proprii în cadrul unui audit de securitate și test de penetrare.
  • Instalăm actualizarea PHP, repornim toți workerii și testăm apoi aplicația.

Întrebări frecvente

Este PHP un limbaj orientat pe obiecte?

PHP acceptă atât cod procedural, cât și cod orientat pe obiecte. Framework-urile, nucleele de CMS și sistemele de magazin sunt astăzi însă construite predominant orientat pe obiecte, cu clase, interfețe și namespace-uri.

Care este diferența dintre o interfață și o clasă abstractă?

O interfață descrie doar ce metode trebuie să ofere o clasă. O clasă abstractă poate conține în plus cod și proprietăți, dar nu poate fi instanțiată direct. O clasă poate avea mai multe interfețe, dar o singură clasă părinte.

De când există enum-uri în PHP?

Enumerările au apărut cu PHP 8.1. Ele înlocuiesc colecțiile de constante cu un tip propriu, care permite doar cazurile definite. Backed enums au în plus o valoare de tip int sau string.

De ce sunt relevante pentru securitate metodele magice?

Metode precum __destruct sau __wakeup sunt apelate automat de PHP, de exemplu la deserializarea datelor. Dacă date străine ajung neverificate în unserialize(), pot declanșa procese neașteptate în clasele existente.

Surse

Contact imediat

Fiecare oră contează. Scrieți-ne acum.

Descrieți pe scurt sistemul, versiunea PHP și ce ați observat. Ne vom face auziți, clarificăm situația și lucrăm la distanță până când incidentul este încheiat și documentat.

Ajutor imediat