Überladung
Überladung bietet in PHP Möglichkeiten, um dynamisch
Eigenschaften und Methoden zu erzeugen
.
Diese dynamisch erzeugten Entitäten werden unter
Zuhilfenahme von magischen Methoden verarbeitet,
die man in einer Klasse zu verschiedenen Aktivitäten
definieren kann.
Die Überladungsmethoden werden aufgerufen, wenn mit
Eigenschaften oder Methoden interagiert wird, die entweder
nicht deklariert wurden oder im aktuellen Geltungsbereich
nicht sichtbar
sind. Im Rest dieses Abschnitts werden die Begriffe
unzugreifbare Eigenschaft
und
unzugreifbare Methode
verwendet, um auf die
Kombination von Deklaration und Sichtbarkeit zu verweisen.
Alle Überladungsmethoden müssen als public definiert sein.
Hinweis:
Keiner der Parameter dieser magischen Methoden kann als Referenz übergeben werden.
Hinweis:
Die Interpretation von
Überladungweicht von den meisten objektorientierten Programmiersprachen ab. Traditionell bezeichnet Überladung die Möglichkeit mehrere Methoden mit gleichem Namen aber unterschiedlichen Anzahlen und Typen von Parametern zu definieren.
Changelog
Version | Beschreibung |
---|---|
5.3.0 | __callStatic hinzugefügt. Eine Warnung wurde hinzugefügt, um die Sichtbarkeit public und nicht statische Deklaration zu erzwingen. |
5.1.0 | __isset und __unset hinzugefügt. Unterstützung von __get() zum Überladen von privaten Eigenschaften hinzugefügt. |
5.0.0 | __get() hinzugefügt. |
Überladung von Eigenschaften
$name
) : bool$name
) : void__set wird aufgerufen, wenn Daten in unzugreifbare (protected oder private) Eigenschaften geschrieben werden sollen.
__get wird verwendet, um Daten aus unzugreifbaren (protected oder private) Eigenschaften zu lesen.
__isset wird aufgerufen, indem isset() oder empty() auf unzugreifbare (protected oder private) Eigenschaften angewendet wird.
__unset wird aufgerufen, wenn unset() für unzugreifbaren (protected oder private) Eigenschaften aufgerufen wird.
Der Parameter $name beinhaltet den Namen der Eigenschaft, mit der interagiert wird. Der Parameter $value der Funktion __set spezifiziert den Wert den die Eigenschaft $name annehmen soll.
Überladung von Eigenschaften funktioniert nur im Kontext von Objekten. Diese magischen Methoden werden nicht aus einem statischen Kontext aufgerufen. Diese Methoden sollten daher nicht als static deklariert werden. Seit PHP 5.3.0 wird eine Warnung ausgegeben, wenn eine dieser magischen Überladungsmethoden als static deklariert ist.
Hinweis:
Der Rückgabewert von __set wird, aufgrund der Behandlung des Zuweisungsoperators in PHP, ignoriert. Aus ähnlichen Gründen wird __get nicht aufgerufen, wenn man Zuweisungen in etwa wie folgt verkettet:
$a = $obj->b = 8;
Beispiel #1 Überladung von Eigenschaften mit den Methoden __get, __set, __isset und __unset
<?php
class EigenschaftTest
{
/** Speicherplatz für überladene Daten. */
private $data = array();
/** Überladung wird nicht bei deklarierten Eigenschaften benutzt. */
public $declared = 1;
/** Überladung wird nur von außerhalb der Klasse angewendet. */
private $hidden = 2;
public function __set($name, $value)
{
echo "Setze '$name' auf '$value'\n";
$this->data[$name] = $value;
}
public function __get($name)
{
echo "Lese '$name'\n";
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}
$trace = debug_backtrace();
trigger_error(
'Undefinierte Eigenschaft für __get(): ' . $name .
' in ' . $trace[0]['file'] .
' Zeile ' . $trace[0]['line'],
E_USER_NOTICE);
return null;
}
/** Seit PHP 5.1.0 */
public function __isset($name)
{
echo "Ist '$name' gesetzt?\n";
return isset($this->data[$name]);
}
/** Seit PHP 5.1.0 */
public function __unset($name)
{
echo "Lösche '$name'\n";
unset($this->data[$name]);
}
/** Keine magische Methode, nur beispielhaft hier. */
public function getHidden()
{
return $this->hidden;
}
}
echo "<pre>\n";
$obj = new EigenschaftTest;
$obj->a = 1;
echo $obj->a . "\n\n";
var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "\n";
echo $obj->declared . "\n\n";
echo "Wir experimentieren nun mit der private-Eigenschaft 'hidden':\n";
echo "Private ist innerhalb der Klasse sichtbar, also wird __get() nicht benutzt...\n";
echo $obj->getHidden() . "\n";
echo "Private nicht sichtbar von außerhalb der Klasse, also wird __get() benutzt...\n";
echo $obj->hidden . "\n";
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Setze 'a' auf '1' Lese 'a' 1 Ist 'a' gesetzt? bool(true) Lösche 'a' Ist 'a' gesetzt? bool(false) 1 Wir experimentieren nun mit der private-Eigenschaft 'hidden': Private ist innerhalb der Klasse sichtbar, also wird __get() nicht benutzt... 2 Private nicht sichtbar von außerhalb der Klasse, also wird __get() benutzt... Lese 'hidden' Notice: Undefinierte Eigenschaft für __get(): hidden in <file> Zeile 70 in <file> on line 29
Überladung von Methoden
__call wird aufgerufen, wenn eine unzugreifbare Methode in einem Objekt aufgerufen wird.
__callStatic wird aufgerufen, wenn eine unzugreifbare Methode in einem statischen Kontext aufgerufen wird.
Der Parameter $name ist der Name der aufgerufenen Methode. Der Parameter $arguments beinhaltet ein Array mit den Parametern, die der Methode $name übergeben wurden.
Beispiel #2 Überladung von Methoden mit den methoden __call und __callStatic
<?php
class MethodenTest {
public function __call($name, $arguments)
{
// Achtung: Der Wert von $name beachtet die Groß-/Kleinschreibung
echo "Rufe die Objektmethode '$name' "
. implode(', ', $arguments). "\n";
}
/** Seit PHP 5.3.0 */
public static function __callStatic($name, $arguments)
{
// Achtung: Der Wert von $name beachtet die Groß-/Kleinschreibung
echo "Rufe die statische Methode '$name' "
. implode(', ', $arguments). "\n";
}
}
$obj = new MethodenTest;
$obj->runTest('eines Objektes auf');
MethodTest::runTest('aus statischem Kontext auf'); // Seit PHP 5.3.0
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Rufe die Objektmethode 'runTest' eines Objektes auf Rufe die statische Methode 'runTest' aus statischem Kontext auf
Deutsche Übersetzung
Sie haben gebeten, diese Seite auf Deutsch zu besuchen. Momentan ist nur die Oberfläche übersetzt, aber noch nicht der gesamte Inhalt.Wenn Sie mir bei Übersetzungen helfen wollen, ist Ihr Beitrag willkommen. Alles, was Sie tun müssen, ist, sich auf der Website zu registrieren und mir eine Nachricht zu schicken, in der Sie gebeten werden, Sie der Gruppe der Übersetzer hinzuzufügen, die Ihnen die Möglichkeit gibt, die gewünschten Seiten zu übersetzen. Ein Link am Ende jeder übersetzten Seite zeigt an, dass Sie der Übersetzer sind und einen Link zu Ihrem Profil haben.
Vielen Dank im Voraus.
Dokument erstellt 30/01/2003, zuletzt geändert 26/10/2018
Quelle des gedruckten Dokuments:https://www.gaudry.be/de/php-rf-language.oop5.overloading.html
Die Infobro ist eine persönliche Seite, deren Inhalt in meiner alleinigen Verantwortung liegt. Der Text ist unter der CreativeCommons-Lizenz (BY-NC-SA) verfügbar. Weitere Informationen auf die Nutzungsbedingungen und dem Autor.
Referenzen
Diese Verweise und Links verweisen auf Dokumente, die während des Schreibens dieser Seite konsultiert wurden, oder die zusätzliche Informationen liefern können, aber die Autoren dieser Quellen können nicht für den Inhalt dieser Seite verantwortlich gemacht werden.
Der Autor Diese Website ist allein dafür verantwortlich, wie die verschiedenen Konzepte und Freiheiten, die mit den Nachschlagewerken gemacht werden, hier dargestellt werden. Denken Sie daran, dass Sie mehrere Quellinformationen austauschen müssen, um das Risiko von Fehlern zu reduzieren.