Zum Inhalt

Objektorientierte Programmierung

PHP ist eine objektorientierte Programmiersprache und besitzt alle gängigen Konzepte einer objektorientierten Programmiersprache.

Klassen

Klassen werden über das Schlüsselwort class definiert. Es gibt spezielle Methoden wie den Konstruktor (__construct), welche mit doppeltem Unterstrich beginnen. Alle Member sind generell public außer es wird explizit anders angegeben wie zB für den Member $color.

Mit dem Schlüsselwort new können Klasseninstanzen erzeugt werden. Über die Variable $this kann innerhalb der Klasse auf die Instanz zugegriffen werden. Zugriff auf Member der Instanz wird über -> durchgeführt. So wird zum Beispiel die Methode drive auf der Instanz $veh über $veh->drive() ausgeführt.

<?php

class Vehicle
{
    protected $color;

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

    function drive()
    {
        echo $this->color . " vehicle is driving!";
    }
}

$veh = new Vehicle("red");
$veh->drive();  // red vehicle is driving!

Magic Methods

Es sind einige spezielle Methoden (Magic Methods) für Klassen definiert. Die Methodennamen dieser speziellen Methoden beginnen mit __ (zB der Konstruktor __construct). Eine Übersicht aller Magic Methods findet sich in der PHP Dokumentation. Eine Auswahl dieser Methoden werden im folgenden dargestellt.

__set und __get

Für Setter und Getter gibt es die generischen Methoden __set und __get. Falls diese Methoden implementiert werden, werden diese für jegliches Setzen bzw. Abfragen von Objekt Attributen aufgerufen.

<?php

class Product
{
    protected $name;
    protected $price;

    function __set($name, $value)
    {
        if ($name == "name") {
            $this->name = (string) $value;
        } elseif ($name == "price") {
            $this->price = (float) $value;
        }
    }

    function __get($name)
    {
        if ($name == "name") {
            return $this->name;
        } elseif ($name == "price") {
            return $this->price;
        } elseif ($name == "vat") {
            return $this->price * 0.2;
        }
    }
}

$product = new Product();
$product->name = "Mein Produkt";
$product->price = 3.99;

echo $product->name . "/ Preis inkl. MWSt.: " . $product->vat . "\n";

__invoke

Mit der Implementierung der Methode __invoke kann ein Objekt wie eine Funktion genutzt werden. Der Nutzen liegt dabei darin, dass das Objekt einen internen Zustand halten kann, welcher über mehrmalige Aufrufe erhalten bleibt. Dies soll im folgenden Beispiel demonstriert w:

<?php

class FunctionObject
{
    protected $internalState = 10;

    function __invoke()
    {
        $this->internalState++;
        return $this->internalState;
    }
}

$obj = new FunctionObject();
$result = $obj(); // 11
$result = $obj(); // 12
$result = $obj(); // 13

__toString

Durch überschreiben der Methode __toString kann bestimmt werden, wie ein Objekt in einen String überführt wird. Dies ist unter anderem zu Debugging Zwecken sehr hilfreich.

__call

Die Methode __call wird aufgerufen, wenn eine nicht existierende Methode auf einem Objekt aufgerufen wird.

<?php

class Vehicle
{
    function __call($methodName, $arguments)
    {
        if ($methodName == "drive") {
            echo "Das Fahrzeug fährt\n";
        } elseif($methodName == "break" || $methodName == "stop") {
            echo "Das Fahrzeug bremst\n";
        } else {
            echo "Diese Aktion führt zu nichts...\n";
        }
    }
}

$veh = new Vehicle();
$veh->drive();  // Das Fahrzeug fährt
$veh->break();  // Das Fahrzeug bremst

$veh->irgendEineMethodeMitKomischemName();  // Diese Aktion führt zu nichts...
$veh->andereMethodeOhneNutzen();            // Diese Aktion führt zu nichts...

Vererbung

Über das Schlüsselwort extends wird die Klassenvererbung durchgeführt. PHP unterstützt keine Mehrfachvererbung.

<?php

class Car extends Vehicle
{
    function drive()
    {
        echo $this->color . " CAR is driving!";
    }
}

$car = new Car("blue");
$car->drive();  // blue CAR is driving!

Statische Member

Mit dem Schlüsselwort static können statische Member einer Klasse definiert werden. Zugriff auf statische Member wird über den :: Operator durchgeführt (Scope Resolution Operator). Innerhalb der Klasse kann mit dem Schlüsselwort self auf statische Member zugegriffen werden.

<?php

class Car
{
    protected static $wheel_count = 4;

    public static function checkWheels($wheel_count)
    {
        return $wheel_count == self::$wheel_count;
    }
}

echo Car::checkWheels(5) ? "richtige Reifenanzahl" : "falsche Reifenanzahl";
// Ausgabe: falsche Reifenanzahl

Klassenkonstanten

Ähnlich zu statischen Member können Konstanten innerhalb einer Klasse definiert werden. Der Zugriff auf Konstanten funktioniert analog zu statischen Member über den Scope Resolution Operator (::).

<?php

class Car
{
    const WHEELS = 4;

    function drive() {
        echo  self::WHEELS . " wheels rolling... \n";
    }
}

$car = new Car();
$car->drive(); // 4 wheels rolling...

Traits

Mit Traits können Klassen einfach erweitert werden. Anders als über Vererbung kann eine Klasse von mehreren Traits erweitert werden. Von Traits können keine Instanzen gebildet werden sie dienen ausschließlich der Erweiterung von Klassen.

Hinweis

Traits sind ein sehr nützliches Programmierkonstrukt um Klassen zu erweitern. Im Gegensatz zur klassischen Vererbung sind Traits sehr leichtgewichtig und können wiederkehrende Funktionalität über unterschiedliche Klassenhierarchien hinweg an Klassen bereitstellen.

Im Folgenden wird das gängige Singleton Design Pattern mit Hilfe eines Traits implementiert. Ein Trait wird über das Schlüsselwort use in die Klasse integriert:

<?php

trait Singleton
{
    protected static $instance;

    public static function instance()
    {
        if (!self::$instance) {
            self::$instance = new static();
        }
        return self::$instance;
    }
}

class ExampleClass
{
    use Singleton;
}

$instance = ExampleClass::instance();

Weiteres zu Klassen

PHP unterstützt noch weitere Aspekte der Objektorientierten Programmierung, welche bereits aus der Programmierung mit Java bekannt sind. Hier sind zum Beispiel anonyme Klassen, abstrakte Klassen und Methoden, Interfaces oder das final Keyword zu nennen. Die PHP-Dokumentation bietet einen guten Überblick über weitere Objektorientierte Programmiertechniken.