PHP OOP: Der komplette Guide 2025

Objektorientierte Programmierung in PHP meistern: Von Klassen und Objekten über Vererbung bis zu Interfaces und Traits. Mit modernen PHP 8+ Features, PSR-Standards und Laravel-Integration für professionelle Webentwicklung.

🐘 OOP in PHP

Objektorientierte Programmierung (OOP) ist ein Programmierparadigma, das auf dem Konzept von "Objekten" basiert. PHP unterstützt OOP vollständig seit Version 5 und hat mit PHP 8+ moderne Features wie Constructor Property Promotion, Union Types und Enums hinzugefügt.

4
OOP Prinzipien
PHP 8+
Moderne Features
PSR
Standards

1. Klassen und Objekte

Eine Klasse ist ein Bauplan für Objekte. Ein Objekt ist eine Instanz einer Klasse. Klassen definieren Eigenschaften (Properties) und Methoden (Methods), die das Verhalten von Objekten bestimmen.

🏗️ Einfache Klasse definieren

<?php

class User
{
    // Eigenschaften (Properties)
    public string $name;
    public string $email;
    private int $age;

    // Methoden (Methods)
    public function getName(): string
    {
        return $this->name;
    }

    public function setAge(int $age): void
    {
        if ($age >= 0) {
            $this->age = $age;
        }
    }
}

🎯 Objekt erstellen und verwenden

// Objekt instanziieren
$user = new User();

// Eigenschaften setzen
$user->name = 'Max Mustermann';
$user->email = 'max@example.com';

// Methoden aufrufen
$user->setAge(30);
echo $user->getName(); // Max Mustermann

💡 Wichtige Konzepte

  • $this: Referenz auf das aktuelle Objekt
  • new: Keyword zum Erstellen neuer Objekte
  • ->: Operator für Zugriff auf Eigenschaften und Methoden
  • Kapselung: Private Eigenschaften sind nur innerhalb der Klasse zugänglich

2. Eigenschaften und Methoden

Eigenschaften speichern den Zustand eines Objekts, während Methoden das Verhalten definieren. PHP unterstützt verschiedene Sichtbarkeitsmodifikatoren und Typisierung.

🏷️ Eigenschaften (Properties)

class Product
{
    // Typisierte Eigenschaften
    public string $name;
    private float $price;
    protected array $tags = [];
    
    // Konstanten
    public const TAX_RATE = 0.19;
}

⚙️ Methoden (Methods)

class Calculator
{
    // Öffentliche Methode
    public function add(int $a, int $b): int
    {
        return $a + $b;
    }
    
    // Statische Methode
    public static function multiply(int $a, int $b): int
    {
        return $a * $b;
    }
}

🔧 Getter und Setter

class BankAccount
{
    private float $balance = 0.0;

    // Getter
    public function getBalance(): float
    {
        return $this->balance;
    }

    // Setter mit Validierung
    public function deposit(float $amount): void
    {
        if ($amount > 0) {
            $this->balance += $amount;
        } else {
            throw new InvalidArgumentException('Amount must be positive');
        }
    }
}

3. Konstruktor und Destruktor

Der Konstruktor wird beim Erstellen eines Objekts aufgerufen, der Destruktor beim Zerstören. PHP 8+ bietet Constructor Property Promotion für saubereren Code.

🚀 PHP 8+ Constructor Property Promotion

class User
{
    public function __construct(
        private string $name,
        private string $email,
        private DateTime $createdAt = new DateTime()
    ) {}

    public function getName(): string
    {
        return $this->name;
    }

    public function getEmail(): string
    {
        return $this->email;
    }
}

// Verwendung
$user = new User('Ada Lovelace', 'ada@example.com');

✨ Vorteile von Constructor Property Promotion

  • Weniger Code: Eigenschaften werden automatisch deklariert
  • Sauberer: Keine doppelte Deklaration von Eigenschaften
  • Typsicher: Automatische Typisierung der Eigenschaften
  • Modern: Nutzt PHP 8+ Features optimal aus

4. Vererbung (Inheritance)

Vererbung ermöglicht es, neue Klassen basierend auf bestehenden Klassen zu erstellen. Die Kindklasse erbt alle Eigenschaften und Methoden der Elternklasse und kann diese erweitern oder überschreiben.

👨‍👩‍👧‍👦 Basis- und abgeleitete Klassen

// Basisklasse
class Animal
{
    public function __construct(
        protected string $name,
        protected int $age
    ) {}

    public function makeSound(): string
    {
        return "Some generic animal sound";
    }

    public function getInfo(): string
    {
        return "{$this->name} is {$this->age} years old";
    }
}

// Abgeleitete Klasse
class Dog extends Animal
{
    public function __construct(
        string $name,
        int $age,
        private string $breed
    ) {
        parent::__construct($name, $age);
    }

    // Methode überschreiben
    public function makeSound(): string
    {
        return "Woof! Woof!";
    }

    public function fetch(): string
    {
        return "{$this->name} is fetching the ball!";
    }
}

🔑 Wichtige Keywords

  • extends: Definiert Vererbung zwischen Klassen
  • parent:: Zugriff auf Methoden der Elternklasse
  • protected: Zugriff nur in der Klasse und Kindklassen
  • final: Verhindert weitere Vererbung oder Überschreibung

5. Interfaces

Interfaces definieren Verträge, die Klassen implementieren müssen. Sie spezifizieren, welche Methoden eine Klasse haben muss, ohne die Implementierung vorzugeben.

📋 Interface definieren und implementieren

interface PaymentProcessorInterface
{
    public function processPayment(float $amount): bool;
    public function refund(string $transactionId): bool;
}

class StripePaymentProcessor implements PaymentProcessorInterface
{
    public function processPayment(float $amount): bool
    {
        // Stripe API Implementierung
        return $amount > 0;
    }

    public function refund(string $transactionId): bool
    {
        // Refund Implementierung
        return true;
    }
}

6. Traits

Traits ermöglichen es, Code zwischen Klassen zu teilen, ohne Vererbung zu verwenden. Sie lösen das Problem der Mehrfachvererbung in PHP.

🔄 Trait definieren und verwenden

trait Timestampable
{
    private DateTime $createdAt;
    private DateTime $updatedAt;

    public function touch(): void
    {
        $this->updatedAt = new DateTime();
    }

    public function getCreatedAt(): DateTime
    {
        return $this->createdAt;
    }
}

class User
{
    use Timestampable;

    public function __construct(
        private string $name
    ) {
        $this->createdAt = new DateTime();
        $this->updatedAt = new DateTime();
    }
}

7. Abstrakte Klassen

Abstrakte Klassen können nicht instanziiert werden und dienen als Basisklassen für andere Klassen. Sie können abstrakte Methoden definieren, die von Kindklassen implementiert werden müssen.

abstract class Shape
{
    protected string $color;

    public function __construct(string $color)
    {
        $this->color = $color;
    }

    // Abstrakte Methode - muss implementiert werden
    abstract public function calculateArea(): float;

    // Konkrete Methode
    public function getColor(): string
    {
        return $this->color;
    }
}

class Circle extends Shape
{
    public function __construct(
        string $color,
        private float $radius
    ) {
        parent::__construct($color);
    }

    public function calculateArea(): float
    {
        return pi() * $this->radius ** 2;
    }
}

8. Sichtbarkeit (Visibility)

PHP bietet drei Sichtbarkeitsmodifikatoren, die den Zugriff auf Eigenschaften und Methoden kontrollieren.

ModifierZugriff vonBeschreibung
publicÜberallZugriff von allen Klassen und Objekten
protectedKlasse + KindklassenNur innerhalb der Klasse und Vererbungshierarchie
privateNur eigene KlasseNur innerhalb der definierenden Klasse

9. PHP 8+ Features

PHP 8+ bringt viele moderne OOP-Features, die die Entwicklung effizienter und typsicherer machen.

🎯 Union Types

class DataProcessor
{
    public function process(
        string|array $data
    ): string {
        if (is_array($data)) {
            return json_encode($data);
        }
        return $data;
    }
}

🔢 Enums

enum Status: string
{
    case PENDING = 'pending';
    case APPROVED = 'approved';
    case REJECTED = 'rejected';
}

class Order
{
    public function __construct(
        private Status $status
    ) {}
}

🎨 Readonly Properties

class ImmutableUser
{
    public function __construct(
        public readonly string $id,
        public readonly string $email,
        public readonly DateTime $createdAt
    ) {}
}

// Eigenschaften können nach Initialisierung nicht geändert werden
$user = new ImmutableUser('123', 'user@example.com', new DateTime());
// $user->email = 'new@example.com'; // Fehler!

🚀 Weitere PHP 8+ Features

  • Named Arguments: Funktionsaufrufe mit benannten Parametern
  • Match Expression: Moderne Alternative zu switch
  • Nullsafe Operator: $user?->getProfile()?->getName()
  • Attributes: Metadaten für Klassen und Methoden

10. Best Practices

✅ Do's

  • • Verwende Constructor Property Promotion (PHP 8+)
  • • Nutze Interfaces für lose Kopplung
  • • Implementiere Single Responsibility Principle
  • • Verwende Traits für wiederverwendbaren Code
  • • Typisiere alle Parameter und Rückgabewerte
  • • Folge PSR-Standards
  • • Verwende private/protected für Kapselung

❌ Don'ts

  • • Vermeide tiefe Vererbungshierarchien
  • • Verwende keine öffentlichen Eigenschaften ohne Grund
  • • Mische nicht Geschäftslogik mit Präsentation
  • • Vermeide God Objects (zu große Klassen)
  • • Verwende keine statischen Methoden für Zustand
  • • Ignoriere nicht Exception Handling

🚀 SOLID Prinzipien

  • S - Single Responsibility: Eine Klasse sollte nur einen Grund zur Änderung haben
  • O - Open/Closed: Offen für Erweiterung, geschlossen für Modifikation
  • L - Liskov Substitution: Kindklassen müssen Elternklassen ersetzen können
  • I - Interface Segregation: Kleine, spezifische Interfaces statt große
  • D - Dependency Inversion: Abhängigkeiten von Abstraktionen, nicht Konkretionen