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.
📚 Inhaltsverzeichnis
🐘 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.
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.
Modifier | Zugriff von | Beschreibung |
---|---|---|
public | Überall | Zugriff von allen Klassen und Objekten |
protected | Klasse + Kindklassen | Nur innerhalb der Klasse und Vererbungshierarchie |
private | Nur eigene Klasse | Nur 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