OOP PHP5 - Unterschiede - Statische Methoden und Eigenschaften
1. Einführung
Bisher haben wir nur mit "normalen" Klassen, Eigenschaften und Methoden zu tun gehabt. Allerdings bietet uns PHP mittlerweile etliche Möglichkeiten, diese Dinge zu verfeinern. Zum einen hängt das mit der Modellierung einer Anwendung zusammen und zum anderen mit bestimmten Situationen, die sich daraus ergeben können. Ist im Moment noch ein wenig unverständlich, aber ich hoffe, dass sich das bald erledigt.
2. Besonderheiten
Statische Eigenschaften und Methoden bewegen sich außerhalb des eigentlichen Objektkontextes. Das heißt, dass man nicht über ein abgeleitetes Objekt darauf zugreift, sondern zum Beispiel über den Klassennamen und dem berühmten Paramy-Dings-Irgendwas, also dem Doppel-Doppelpunkt. Zu den Feinheiten komme ich gleich.
3. Definition
Sowohl bei den Eigenschaften als auch Methoden setzt man ein static
, um sie als solche festzulegen. Dabei spielt es keine
Rolle, ob man das vor die Sichtbarkeitsstufe stellt oder danach. Es sind also folgende Möglichkeiten denkbar. Ich persönlich bevorzuge
aber eindeutig die erste Schreibweise! Ich bin es einfach gewöhnt, dass die Sichtbarkeit, wie sonst auch, am Anfang steht. Bei der zweiten
Variante krieg ich immer die Krise. Ist nur meine persönliche Meinung.
class Mensch
{
public static $geschlecht;
public static function setName($value) { ... }
}
class Mensch
{
static public $geschlecht;
static public function setName($value) { ... }
}
4. Zugriffsmöglichkeiten
Das hängt von der Sichtbarkeit ab. Wenn man public
nimmt, so geschieht das normalerweise über
Klassenname::Eigenschaft/Methode()
.
class Mensch
{
public static $geschlecht;
public static function setName($value) { ... }
}
Mensch::$geschlecht = 'Mann';
Mensch::setName ('Peter');
Ansonsten gibt es noch self
und parent
. Ersteres nimmt man, wenn man in der eigenen Klasse auf eine
statische Eigenschaft oder Methode zugreift, Letzteres bei Elternklassen.
class Mensch
{
private static $geschlecht;
protected static function setzGeschlecht($value)
{
self::$geschlecht = $value;
}
}
class Mann extends Mensch
{
public function __construct($geschlecht)
{
parent::setzGeschlecht ($geschlecht);
}
}
$dieter = new Mann('männlich');
Ein Hinweis
self
und parent
müssen nicht zwingend genommen werden. Man hätte in diesem Beispiel auch problemlos
mit Mensch::setzGeschlecht ($geschlecht);
und Mensch::$geschlecht = $value;
arbeiten können.
Trotzdem sollte man so nicht arbeiten, da self
und parent
schlichtweg die Lesbarkeit erhöhen.
5. Aber!
Das oben gezeigte Beispiel ist völliger Tinnef. Warum? Nun, setzt mal ein print_r($dieter);
und schaut euch das Ergebnis
an. Da steht ein läppisches Mann Object ( )
. Denn an diesem Beispiel könnt ihr sehr schön sehen, dass sich
statische Eigenschaften und Methoden außerhalb des Objektkontextes befinden. Und da muss man ein paar Dinge beachten
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt