Kapitel 14. Klassen und Objekte

Inhaltsverzeichnis
Klassen
extends
Konstruktoren
::
parent
Objekte serialisieren - Objekte in Sessions
Die "magischen" Funktionen __sleep und __wakeup
Referenzen innherhalb des Konstruktors

Klassen

Eine Klasse ist eine Sammlung von Variablen und Funktionen, die mit diesen Variablen arbeiten. Eine Klasse wird folgendermaßen definiert:

<?php
class Cart
{
    var $items;  // Artikel in unserem Einkaufswagen
   
    // Füge dem Einkaufswagen $num Artikel der Sorte $artnr zu
 
    function add_item ($artnr, $num)
    {
        $this->items[$artnr] += $num;
    }
   
    // Nimm $num Artikel von $artnr aus dem Einkaufswagen
 
    function remove_item ($artnr, $num)
    {
        if ($this->items[$artnr] > $num) {
            $this->items[$artnr] -= $num;
            return true;
        } else {
            return false;
        }   
    }
}
?>

In diesem Beispiel wird eine Klasse "Cart" definiert. Sie besteht aus einem assoziativen Array von Produkten im Einkaufswagen und zwei Funktionen zum Hinzufügen und Entfernen von Artikeln.

Achtung

Die folgenden warnenden Bemerkungen gelten für PHP 4.

Der Name stdClass ist reserviert, da er intern von Zend benutzt wird. Sie können in PHP keine Klasse mit dem Namen stdClass haben.

Die Funktionsnamen __sleep und __wakeup sind in PHP Klassen "magisch". Sie können in Ihren Klassen keine Funktionen mit diesen Namen haben, außer Sie wollen sie mit dieser "magischen" Funktionalität assoziieren. Mehr Informationen dazu finden Sie weiter unten.

Sämtliche mit __ beginnende Funktionsnamen sind PHP als "magisch" vorbehalten. Es wird empfohlen, in PHP keine Funktionsnamen mit __ zu verwenden, außer Sie möchten dokumentierte "magische" Funktionalität.

Anmerkung: In PHP 4 sind nur konstante Initialisierungen für var Variablen erlaubt. Um Variablen mit nicht konstanten Werten zu initialisieren, benötigen Sie eine Funktion zur Initialisierung, welche beim Erstellen eines Objektes automatisch von der Klasse aufgerufen wird. Eine solche Funktion wird Konstruktor genannt (siehe unten).

<?php
/* Keine wird in PHP 4 funktionieren */
class Cart
{
    var $todays_date = date("Y-m-d");
    var $name = $firstname;
    var $owner = 'Fred ' . 'Jones';
    var $items = array("VCR", "TV");
}

/* So sollte es gemacht werden */
class Cart
{
    var $todays_date;
    var $name;
    var $owner;
    var $items;

    function Cart()
    {
        $this->todays_date = date("Y-m-d");
        $this->name = $GLOBALS['firstname'];
        /* etc. . . */
    }
}
?>

Klassen sind Typen, das heißt sie sind die Blaupausen für reale Variablen. Um sie zu nutzen, muss zunächst eine Variable mit dem Operator new angelegt werden.

<?php
$cart = new Cart;
$cart->add_item("10", 1);

$another_cart = new Cart;
$another_cart->add_item("0815", 3);

Dies erstellt die Objekte $cart und $another_cart aus der Klasse Cart. Dann wird die Funktion add_item() des $cart Objektes aufgerufen, um $cart einen Artikel mit der Artikelnummer 10 hinzuzufügen. 3 Artikel mit der Artikelnummer 0815 werden $another_cart hinzugefügt.

Sowohl $cart als auch $another_cart haben die Funktionen add_item(), remove_item() und die Variable items. Dies sind verschiedene Funktionen und Variablen. Sie können sich Objekte ähnlich den Verzeichnissen in einem Dateisystem vorstellen. Sie können in einem Dateisystem zwei verschiedene Dateien README.TXT haben, solange sie sich in verschiedenen Verzeichnissen befinden. So wie Sie in Verzeichnissen den vollen Pfadnamen eingeben müssen, um jede Datei von dem obersten Verzeichnis aus zu erreichen, müssen Sie auch den vollen Namen der aufzurufenden Funktion angeben: Das heißt für PHP, dass das Hauptverzeichnis der globale Namensbereich, und der Separator des Pfadnamens -> wäre. Deshalb benennen die Namen $cart->items und $another_cart->items auch zwei verschiedene Variablen. Beachten Sie, dass die Variable $cart->items, und nicht $cart->$items genannt wird, da ein Variablenname in PHP nur ein einziges Dollarzeichen hat.

// korrekt, einfaches $
$cart->items = array("10" => 1); 

// falsch, denn $cart->$items wird zu $cart->""
$cart->$items = array("10" => 1);

// richtig aber fraglich, ob dies erwünscht war:
// $cart->$myvar wird zu $cart->items
$myvar = 'items';
$cart->$myvar = array("10" => 1);

Innerhalb einer Klassendefinition ist nicht bekannt, unter welchem Namen das Objekt in Ihrem Programm erreichbar sein wird: Als die Klasse Cart geschrieben wurde war nicht bekannt, dass das Objekt später $cart oder $another_cart genannt wird. Deshalb können Sie innerhalb der Klasse Cart selbst auch nicht $cart->items schreiben. Um nun die eigenen Funktionen und Variablen innerhalb einer Klasse anzusprechen, können Sie die Pseudo-Variable $this verwenden, welche Sie auch als 'meine eigene' oder 'aktuelles Objekt' verstehen können. Deshalb kann '$this->items[$artnr] += $num' auch als 'addiere $num zu $artnr in meinem eigenen Array items', oder 'addiere $num zu $artnr im Array items innerhalb des aktuellen Objektes' lesen.

Anmerkung: Es gibt ein paar angenehme Funktionen, um mit Klassen und Objekten umzugehen. Mehr darüber erfahren Sie im Kapitel Klassen- und Objekt-Funktionen.