Jede Klassendefinition beginnt mit dem Schlüsselwort class, gefolgt von einem Klassennamen, welcher ein beliebiger Name sein kann, der kein reservierter Bezeichner von PHP ist. Darauf folgt ein Paar geschweifter Klammern, die die Definitionen der Klassenmember und -methoden enthalten. Die Pseudovariable $this ist verfügbar, falls eine Methode aus einem Objektkontext heraus aufgerufen wird. $this ist eine Referenz auf das aufrufende Objekt (üblicherweise das Objekt, zu dem die Methode gehört, es kann sich aber auch um ein anderes Objekt handeln, falls die Methode statisch aus dem Kontext eines zusätzlichen Objektes aufgerufen wird). Dies wird anhand der nachfolgenden Beispiele erläutert:
Beispiel #1 $this-Variable in objektorientierter Programmierung
<?php
class A
{
function foo()
{
if (isset($this)) {
echo '$this ist definiert (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this ist nicht definiert.\n";
}
}
}
class B
{
function bar()
{
A::foo();
}
}
$a = new A();
$a->foo();
A::foo();
$b = new B();
$b->bar();
B::bar();
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
$this ist definiert (A) $this ist nicht definiert. $this ist definiert (B) $this ist nicht definiert.
Beispiel #2 Einfache Klassendefinition
<?php
class SimpleClass
{
// Memberdeklaration
public $var = 'ein Vorgabewert';
// Methodendeklaration
public function displayVar() {
echo $this->var;
}
}
?>
Der Standardwert muss ein konstanter Ausdruck sein, aber nicht z.B. eine Variable, ein Klassenattribut oder ein Funktionsaufruf.
Beispiel #3 Standardwerte von Klassenattributen
<?php
class SimpleClass
{
// ungültige Attributdeklarationen:
public $var1 = 'hallo '.'welt';
public $var2 = <<<EOD
hallo welt
EOD;
public $var3 = 1+2;
public $var4 = self::myStaticMethod();
public $var5 = $myVar;
// gültige Attributdeklarationen
public $var6 = myConstant;
public $var7 = self::classConstant;
public $var8 = array(true, false);
}
?>
Hinweis: Es gibt nette Funktionen, um Klassen und Objekte zu behandeln. Sie möchten vielleicht einen Blick auf Klassen/Objekte werfen.
Im Gegensatz zu Heredocs, können Nowdocs in beliebigem, statischem Kontext genutzt werden.
Beispiel #4 Beispiel mit statischen Daten
<?php
class foo {
// As of PHP 5.3.0
public $bar = <<<'EOT'
bar
EOT;
}
?>
Hinweis: Nowdoc-Unterstützung wurde in PHP 5.3.0 hinzugefügt.
Um eine Instanz einer Klasse zu erzeugen, muss ein neues Objekt erzeugt und einer Variablen zugewiesen werden. Bei der Erzeugung wird das Objekt immer zugewiesen, außer wenn das Objekt einen definierten Konstruktor besitzt, der aufgrund eines Fehlers eine Exception wirft. Klassen sollten vor ihrer Instantiierung definiert werden (in manchen Fällen ist dies eine Notwendigkeit).
Beispiel #5 Eine Instanz erzeugen
<?php
$instanz = new SimpleClass();
// dies ist auch mit einer Variablen möglich:
$klassenname = 'Foo';
$instanz = new $klassenname(); // Foo()
?>
Im Kontext einer Klasse ist es möglich, neue Objekte mit new self und new parent anzulegen.
Wenn man eine bereits erzeugte Instanz einer Klasse einer neuen Variablen zuweist, wird die neue Variable auf die selbe Instanz zugreifen wie das Objekt, das zugewiesen wurde. Dieses Verhalten ist das selbe, wenn man Instanzen an Funktionen übergibt. Eine Kopie eines bereits erzeugten Objektes erhält man, indem man es klont.
Beispiel #6 Objektzuweisung
<?php
$zugewiesen = $instanz;
$referenz =& $instanz;
$instanz->var = '$zugewiesen wird diesen Wert haben';
$instanz = null; // $instanz und $referenz werden null
var_dump($instanz);
var_dump($referenz);
var_dump($zugewiesen);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
NULL NULL object(SimpleClass)#1 (1) { ["var"]=> string(30) "$zugewiesen wird diesen Wert haben" }
Eine Klasse kann Methoden und Member einer anderen Klasse erben, indem man das extends-Schlüsselwort in der Deklaration benutzt. Es ist nicht möglich, mehrere Klassen zu erweitern, eine Klasse kann nur eine einzige Basisklasse beerben.
Die ererbten Methoden - es sei denn, sie wurden von der Vaterklasse als final definiert - und Member können überschrieben werden, indem Sie mit dem selben Namen wie in der Vaterklasse erneut deklariert werden. Es ist möglich, auf die überschriebenen Methoden oder statischen Member zuzugreifen, wenn diese mittels parent:: referenziert werden.
Beispiel #7 Einfache Vererbung
<?php
class ExtendClass extends SimpleClass
{
// Die Vatermethode überschreiben
function displayVar()
{
echo "Erweiternde Klasse\n";
parent::displayVar();
}
}
$extended = new ExtendClass();
$extended->displayVar();
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Erweiternde Klasse ein Vorgabewert