Aktuellt läge: PHP2Shell. Två kritiska PHP-sårbarheter (CVSS 9,2) tillåter skadlig kod utan inloggning. Patchar sedan den 21 oktober 2026.Vad som bör göras nu →

Objektorientering i PHP

Moderna PHP-applikationer är nästan alltid objektorienterade. Sidan förklarar byggstenarna, nyheterna i PHP 8.0 till 8.4 och varför magiska metoder spelar roll för säkerheten.

Aktualitet 5 min läsningPHP-kunskap

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.

Källor

Direktkontakt

Varje timme räknas. Skriv till oss nu.

Beskriv kort system, PHP-version och observation. Vi hör av oss, klarlägger läget och arbetar på distans tills incidenten är avslutad och dokumenterad.

Direkthjälp