# Objektumorientáltság a PHP-ban

> Objektumorientált PHP: osztályok, interfészek, trait-ek és enumok, újdonságok a PHP 8.0-tól 8.4-ig, valamint a deszerializáció és a biztonság kapcsolata.

Forrás: https://phpsos.de/hu/php/objektorientierung/  
Állapot: 2026. 10. 25.  
Szolgáltató: PHP SOS, PHP-vészhelyzeti segítség és szerverbiztonság. Azonnali segítség WhatsAppon: https://wa.me/491736494914?text=%C3%9Cdv%C3%B6zl%C3%B6m%2C%20PHP%20SOS%21%20Seg%C3%ADts%C3%A9gre%20van%20sz%C3%BCks%C3%A9g%C3%BCnk%20a%20PHP-szerver%C3%BCnkkel.%20C%C3%A9g%3A%20%E2%80%A6%20Weboldal%3A%20%E2%80%A6

**Röviden:** Az objektumorientált programozás (OOP) az adatokat és a hozzájuk tartozó függvényeket osztályokba foglalja. A PHP ehhez osztályokat, absztrakt osztályokat, interfészeket, trait-eket és a PHP 8.1 óta enumokat kínál. A PHP 8.0-tól 8.4-ig sok nyelvi eszköz érkezett, például a konstruktor-promóció, a `readonly`, a property hook-ok és az aszimmetrikus láthatóság. A biztonság szempontjából fontos: a jól kapszulázott kód könnyebben ellenőrizhető, a mágikus metódusok pedig veszélyessé teszik a nem biztonságos deszerializációt. Az értelmezőben lévő rések, mint a PHP2Shell ellen az OOP nem segít.

## Mit jelent az objektumorientált programozás a PHP-ban

Laza függvények és globális változók helyett egy osztály a szakterület egy dolgát írja le: egy rendelést, egy ügyfelet, egy számlát. Meghatározza, milyen adatok tartoznak hozzá (tulajdonságok), és mit lehet vele tenni (metódusok). Az objektum ennek az osztálynak egy konkrét példánya.

A döntéshozók számára ennek gyakorlati értéke van: a világos osztályokból álló objektumorientált kód jobban tesztelhető, ellenőrizhető és átadható szolgáltatóknak. A sok különálló, globális változókat használó szkriptből álló régi PHP-alkalmazások viszont nehezen karbantarthatók, és frissítéskor hibára hajlamosak.

Központi gondolat a kapszulázás: egy osztály kifelé csak azokat a metódusokat teszi elérhetővé, amelyekre másoknak valóban szükségük van, és védi a belső állapotát. Egy rendelést például csak olyan metódussal lehet kifizetettnek jelölni, amely előtte ellenőrzi, egyáltalán megengedett-e ez. Az ilyen szabályok egy helyen való összefogása a biztonságnak is nyereség.

## Az építőelemek áttekintése

| Építőelem | Cél | Rövid példa |
|---|---|---|
| Osztály | tulajdonságokkal és metódusokkal rendelkező objektumok tervrajza | `class Rechnung { ... }` |
| absztrakt osztály | közös alap, közvetlenül nem példányosítható | `abstract class Zahlart { ... }` |
| Interfész | szerződés: milyen metódusokat kell kínálnia egy osztálynak | `interface Versandfaehig { ... }` |
| Trait | újrafelhasználható metódusok közös szülőosztály nélküli osztályoknak | `trait MitZeitstempel { ... }` |
| Enum | megengedett értékek rögzített készlete önálló típusként, a PHP 8.1 óta | `enum Status { case Offen; ... }` |

A láthatóságok (`public`, `protected`, `private`) szabályozzák, ki férhet hozzá a tulajdonságokhoz és a metódusokhoz. Az osztályokat névterekbe szervezik, és autoloaderrel töltik be; hogyan működik ez, azt a [Névterek és autoloading](https://phpsos.de/hu/php/namespaces-autoloading/) oldal mutatja meg.

## Modern PHP: a 8.0-tól 8.4-ig érkezett újdonságok

A következő nyelvi eszközök a PHP-kézikönyvben, illetve a kiadási közleményekben dokumentáltak:

| Verzió | Újdonság |
|---|---|
| 8.0 | konstruktor-promóció, nullsafe operátor `?->`, `::class` objektumokon |
| 8.1 | `readonly` tulajdonságok, enumok, `new` inicializálókban, `final` osztálykonstansokhoz |
| 8.2 | `readonly` osztályok; a dinamikus tulajdonságok elavultnak számítanak |
| 8.3 | `#[\Override]` attribútum, típusos osztálykonstansok |
| 8.4 | property hook-ok, aszimmetrikus láthatóság, `new` körülvevő zárójelek nélkül |

Egy példa, amely több ilyen eszközt kombinál:

```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,  // a PHP 8.4-től
    ) {}

    public function alsBezahltMarkieren(): void
    {
        $this->status = Status::Bezahlt;
    }
}

$b = new Bestellung(42);
$b->alsBezahltMarkieren();
echo $b->status->value;              // bezahlt
$s = Status::tryFrom('storniert');   // null hiba helyett
```

A `readonly` megakadályozza, hogy az azonosítót a létrehozás után módosítsák. A `private(set)` kívülről engedi az olvasást, az írást viszont csak az osztályon belül. Az ilyen biztosítékok a kódban kevésbé valószínűvé teszik azokat a hibákat, amelyek különben csak üzem közben tűnnek fel. A mögöttes típusokat [A PHP típusrendszere](https://phpsos.de/hu/php/typsystem/) oldal magyarázza.

### Frissítési buktatók az objektumorientált kódban

A régebbi alkalmazásoknál két változás különösen releváns. A PHP 8.2.0 óta elavult a dinamikus tulajdonságok létrehozása, vagyis azoké a tulajdonságoké, amelyeket az osztályban nem deklaráltak, kivéve ha az osztály viseli az `#[\AllowDynamicProperties]` attribútumot. A régebbi kód ezt gyakran öntudatlanul használja, és a naplókat megtölti megjegyzésekkel. Emellett a típusos tulajdonságokat a kézikönyv szerint az első olvasás előtt inicializálni kell, különben a PHP `Error`t dob.

Hasznos a PHP 8.3-ból származó `#[\Override]` attribútum: egy metódust a szülő metódus felülírásaként jelöl meg. Ha ez a metódus már nem létezik, például egy programkönyvtárban végzett átnevezés után, a PHP hibát jelez, ahelyett hogy a metódus csendben a semmibe futna. Az ilyen ellenőrzések tervezhetőbbé teszik a frissítéseket; a megrekedt régi projekteknél a [Migráció támogatott PHP-verzióra](https://phpsos.de/hu/leistungen/php-migration-legacy/) szolgáltatásunk segít.

## Objektumok és memória

Az objektumokat a PHP azonosítókon (handle-ökön) keresztül adja tovább. Ha egy objektumot egy függvénynek adunk át, az ugyanazzal az objektummal dolgozik, nem másolattal. Ez hatékony, de könnyen körkörös hivatkozásokhoz vezet, például ha egy rendelés ismeri a tételeit, és minden tétel ismét a rendelését. Az ilyen ciklusokat a referenciaszámlálás önmagában nem takarítja fel; erre a PHP-nak külön szemétgyűjtője (garbage collector) van. A részleteket a [Memóriakezelés a PHP-ban](https://phpsos.de/hu/php/speicherverwaltung/) oldal tartalmazza.

## OOP és biztonság: mágikus metódusok és deszerializáció

A PHP ismer mágikus metódusokat, amelyeket automatikusan hív meg, például a `__construct`, `__destruct`, `__toString`, `__get` vagy `__wakeup`. Ez praktikus, de van árnyoldala: ha egy alkalmazás idegen adatokat az `unserialize()`-zal objektumokká alakít vissza, a támadó meghatározhatja, mely osztályok jönnek létre, és ezzel meglévő kódot indíthat el a mágikus metódusokban. Hogyan előzhető ez meg, azt a [Nem biztonságos deszerializáció a PHP-ban](https://phpsos.de/hu/ratgeber/deserialisierung-php/) útmutató írja le. Röviden: adatcseréhez a `json_encode()` és a `json_decode()` használandó, az `unserialize()`-t pedig csak saját, megbízható adatokhoz szabad alkalmazni, ideális esetben az `allowed_classes` opcióval.

A PHP2Shell ellen viszont a jó objektumorientált kód nem segít. A CVE-2026-109618 és a CVE-2026-109619 az értelmezőben van, és a mod_php esetében a PHP-csapat szerint már azelőtt bemutattak egy exploitot, hogy az alkalmazáskód futna. Kötelező a frissítés a PHP 8.5.12, 8.4.27, 8.3.36 vagy 8.2.35 verzióra, és az összes PHP-folyamat újraindítása.

## Hogyan segít konkrétan a PHP SOS?

- Értékeljük az alkalmazása felépítését, és megmutatjuk, mely részek nehezítik a frissítést támogatott PHP-verzióra.
- Célzottan keresünk kockázatos mintákat, például az `unserialize()` idegen adatokon való használatát és veszélyes mágikus metódusokat.
- Saját fejlesztéseit a [biztonsági audit és penetrációs teszt](https://phpsos.de/hu/leistungen/sicherheitsaudit-penetrationstest/) keretében ellenőrizzük.
- Telepítjük a PHP-frissítést, újraindítjuk az összes workert, és utána teszteljük az alkalmazást.


## Gyakori kérdések

**Objektumorientált nyelv a PHP?**  
A PHP eljárásorientált és objektumorientált kódot egyaránt támogat. A keretrendszerek, a CMS-magok és a webshoprendszerek ma azonban többnyire objektumorientáltan épülnek fel, osztályokkal, interfészekkel és névterekkel.

**Mi a különbség az interfész és az absztrakt osztály között?**  
Az interfész csak azt írja le, milyen metódusokat kell kínálnia egy osztálynak. Az absztrakt osztály ezen túl már kódot és tulajdonságokat is tartalmazhat, de közvetlenül nem példányosítható. Egy osztálynak több interfésze lehet, de csak egy szülőosztálya.

**Mióta léteznek enumok a PHP-ban?**  
Az enumerációk a PHP 8.1-gyel jelentek meg. A konstansgyűjteményeket önálló típussal váltják fel, amely csak a meghatározott eseteket engedi meg. A backed enumok emellett int vagy string értéket is hordoznak.

**Miért biztonsági szempontból relevánsak a mágikus metódusok?**  
Az olyan metódusokat, mint a __destruct vagy a __wakeup, a PHP automatikusan hívja meg, például adatok deszerializálásakor. Ha idegen adatok ellenőrzés nélkül jutnak az unserialize()-ba, az váratlan folyamatokat indíthat el meglévő osztályokban.

## Források

- [PHP-kézikönyv: Osztályok és objektumok, alapok](https://www.php.net/manual/de/language.oop5.basic.php)
- [PHP-kézikönyv: Tulajdonságok](https://www.php.net/manual/en/language.oop5.properties.php)
- [PHP-kézikönyv: Láthatóság](https://www.php.net/manual/en/language.oop5.visibility.php)
- [PHP 8.1 kiadás](https://www.php.net/releases/8.1/en.php)
