Kort sagt: Objektorienterad programmering (OOP) samlar data och tillhörande funktioner i klasser. PHP erbjuder klasser, abstrakta klasser, gränssnitt, traits och sedan PHP 8.1 enums. Med PHP 8.0 till 8.4 tillkom många språkmedel, till exempel konstruktorpromotion, readonly, property hooks och asymmetrisk synlighet. Viktigt för säkerheten: Väl inkapslad kod är lättare att granska, och magiska metoder gör osäker deserialisering farlig. Mot luckor i tolken som PHP2Shell hjälper OOP inte.
Vad objektorienterad programmering betyder i PHP
I stället för att använda lösa funktioner och globala variabler beskriver en klass en sak i verksamheten: en beställning, en kund, en faktura. Den anger vilka data som hör till den (egenskaper) och vad man kan göra med dem (metoder). Ett objekt är ett konkret exemplar av klassen.
För beslutsfattare har det ett praktiskt värde: Objektorienterad kod med tydliga klasser går lättare att testa, granska och lämna över till tjänsteleverantörer. Gamla PHP-applikationer av många enskilda skript med globala variabler är däremot svåra att underhålla och felbenägna vid uppgraderingar.
En central tanke är inkapsling: En klass släpper utåt bara fram de metoder som andra verkligen behöver och skyddar sitt inre tillstånd. En beställning kan då till exempel bara markeras som betald via en metod som först kontrollerar att det alls är tillåtet. Att samla sådana regler på ett ställe är en vinst även för säkerheten.
Byggstenarna i överblick
| Byggsten | Syfte | Kort exempel |
|---|---|---|
| Klass | ritning för objekt med egenskaper och metoder | class Rechnung { ... } |
| abstrakt klass | gemensam bas, kan inte instansieras direkt | abstract class Zahlart { ... } |
| Gränssnitt | kontrakt: vilka metoder en klass måste erbjuda | interface Versandfaehig { ... } |
| Trait | återanvändbara metoder för klasser utan gemensam föräldraklass | trait MitZeitstempel { ... } |
| Enum | fast uppsättning tillåtna värden som egen typ, sedan PHP 8.1 | enum Status { case Offen; ... } |
Synligheter (public, protected, private) reglerar vem som får komma åt egenskaper och metoder. Klasser organiseras i namnrymder och laddas via en autoloader; hur det fungerar visar sidan Namnrymder och autoloading.
Modern PHP: nyheterna från 8.0 till 8.4
Följande språkmedel är dokumenterade i PHP-manualen respektive i release-meddelandena:
| Version | Nyhet |
|---|---|
| 8.0 | konstruktorpromotion, nullsafe-operatorn ?->, ::class på objekt |
| 8.1 | readonly-egenskaper, enums, new i initierare, final för klasskonstanter |
| 8.2 | readonly-klasser; dynamiska egenskaper räknas som föråldrade |
| 8.3 | attributet #[\Override], typade klasskonstanter |
| 8.4 | property hooks, asymmetrisk synlighet, new utan omslutande parenteser |
Ett exempel som kombinerar flera av de här medlen:
<?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, // från 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 i stället för fel
readonly förhindrar att id:t ändras efter att objektet har skapats. private(set) tillåter läsning utifrån men skrivning bara inom klassen. Sådana garantier i koden gör fel mindre sannolika, fel som annars först märks i driften. Typerna bakom förklaras på sidan PHP:s typsystem.
Uppgraderingsfällor i objektorienterad kod
För äldre applikationer är två ändringar särskilt relevanta. Sedan PHP 8.2.0 är det föråldrat att skapa dynamiska egenskaper, alltså egenskaper som inte är deklarerade i klassen, såvida inte klassen bär attributet #[\AllowDynamicProperties]. Äldre kod gör det ofta omedvetet och fyller då loggarna med notiser. Dessutom måste typade egenskaper enligt manualen vara initialiserade före den första läsningen, annars kastar PHP ett Error.
Attributet #[\Override] från PHP 8.3 är användbart: Det markerar en metod som överskrivning av en föräldrametod. Finns den metoden inte längre, till exempel efter att ett bibliotek har bytt namn, rapporterar PHP ett fel i stället för att tyst låta metoden gå i tomma luften. Sådana kontroller gör uppgraderingar mer planerbara; för fastlåsta äldre projekt hjälper vår migrering till en PHP-version som stöds.
Objekt och minne
Objekt förs i PHP vidare via identifierare (handles). Skickar man ett objekt till en funktion arbetar den med samma objekt, inte med en kopia. Det är effektivt men leder lätt till cirkelreferenser, till exempel när en beställning känner sina orderrader och varje rad känner sin beställning. Sådana cykler städas inte upp av referensräkningen ensam; för det har PHP en egen skräpsamlare (garbage collector). Detaljer finns på sidan Minneshantering i PHP.
OOP och säkerhet: magiska metoder och deserialisering
PHP har magiska metoder som anropas automatiskt, till exempel __construct, __destruct, __toString, __get eller __wakeup. Det är praktiskt men har en baksida: Om en applikation med unserialize() förvandlar externa data tillbaka till objekt kan en angripare bestämma vilka klasser som skapas och därmed sätta igång befintlig kod i magiska metoder. Hur man förhindrar det beskriver guiden Osäker deserialisering i PHP. Kort sagt: Använd json_encode() och json_decode() för datautbyte och använd unserialize() bara för egna, pålitliga data, helst med alternativet allowed_classes.
Mot PHP2Shell hjälper god objektorienterad kod däremot inte. CVE-2026-109618 och CVE-2026-109619 ligger i tolken, och för mod_php visades enligt PHP-teamet en exploit innan applikationskoden körs. Det som krävs är uppdateringen till PHP 8.5.12, 8.4.27, 8.3.36 eller 8.2.35 och omstart av alla PHP-processer.
Hur hjälper PHP SOS konkret?
- Vi bedömer hur er applikation är uppbyggd och visar vilka delar som försvårar en uppgradering till en PHP-version som stöds.
- Vi söker målinriktat efter riskfyllda mönster som
unserialize()på externa data och farliga magiska metoder. - Vi granskar egenutvecklad kod inom ramen för en säkerhetsgranskning och penetrationstest.
- Vi installerar PHP-uppdateringen, startar om alla workers och testar applikationen därefter.
Vanliga frågor
Är PHP ett objektorienterat språk?
PHP stöder både procedurell och objektorienterad kod. Ramverk, CMS-kärnor och butikssystem är dock idag till största delen objektorienterade, med klasser, gränssnitt och namnrymder.
Vad är skillnaden mellan gränssnitt och abstrakt klass?
Ett gränssnitt beskriver bara vilka metoder en klass måste erbjuda. En abstrakt klass kan dessutom redan innehålla kod och egenskaper men går inte att instansiera direkt. En klass kan ha flera gränssnitt men bara en föräldraklass.
Sedan när finns enums i PHP?
Uppräkningstyper kom med PHP 8.1. De ersätter samlingar av konstanter med en egen typ som bara tillåter de definierade fallen. Backed enums har dessutom ett int- eller string-värde.
Varför är magiska metoder säkerhetsrelevanta?
Metoder som __destruct eller __wakeup anropar PHP automatiskt, till exempel när data deserialiseras. Hamnar externa data ogranskade i unserialize() kan det utlösa oväntade förlopp i befintliga klasser.