1
0
mirror of https://github.com/php/doc-de.git synced 2026-04-25 07:58:12 +02:00
Files
Andreas Döbeling 68ecfadebe Fix class name typo in runTest call (#207)
Thank you
2025-12-06 19:07:05 +00:00

344 lines
11 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: d6f54016d62904cfd8200604aadd5e3f0d9bad97 Maintainer: simp Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.oop5.overloading" xmlns="http://docbook.org/ns/docbook">
<title>Überladung</title>
<para>
Überladung bietet in PHP Möglichkeiten, um dynamisch
Eigenschaften und Methoden zu <quote>erzeugen</quote>.
Diese dynamisch erzeugten Entitäten werden unter
Zuhilfenahme von magischen Methoden verarbeitet,
die man in einer Klasse zu verschiedenen Aktivitäten
definieren kann.
</para>
<para>
Die Überladungsmethoden werden aufgerufen, wenn mit
Eigenschaften oder Methoden interagiert wird, die entweder
nicht deklariert wurden oder im aktuellen Geltungsbereich
nicht <link linkend="language.oop5.visibility">sichtbar</link>
sind. Im Rest dieses Abschnitts werden die Begriffe
<quote>unzugreifbare Eigenschaft</quote> und
<quote>unzugreifbare Methode</quote> verwendet, um auf die
Kombination von Deklaration und Sichtbarkeit zu verweisen.
</para>
<para>
Alle Überladungsmethoden müssen als <literal>public</literal>
definiert sein.
</para>
<note>
<para>
Keiner der Parameter dieser magischen Methoden kann
<link linkend="functions.arguments.by-reference">als
Referenz</link> übergeben werden.
</para>
</note>
<note>
<para>
Die Interpretation von <quote>Überladung</quote> weicht
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.
</para>
</note>
<sect2 xml:id="language.oop5.overloading.members">
<title>Überladung von Eigenschaften</title>
<methodsynopsis xml:id="object.set">
<modifier>public</modifier> <type>void</type><methodname>__set</methodname>
<methodparam><type>string</type><parameter>name</parameter></methodparam>
<methodparam><type>mixed</type><parameter>value</parameter></methodparam>
</methodsynopsis>
<methodsynopsis xml:id="object.get">
<modifier>public</modifier> <type>mixed</type><methodname>__get</methodname>
<methodparam><type>string</type><parameter>name</parameter></methodparam>
</methodsynopsis>
<methodsynopsis xml:id="object.isset">
<modifier>public</modifier> <type>bool</type><methodname>__isset</methodname>
<methodparam><type>string</type><parameter>name</parameter></methodparam>
</methodsynopsis>
<methodsynopsis xml:id="object.unset">
<modifier>public</modifier> <type>void</type><methodname>__unset</methodname>
<methodparam><type>string</type><parameter>name</parameter></methodparam>
</methodsynopsis>
<para>
<link linkend="object.set">__set</link> wird aufgerufen, wenn Daten in
unzugreifbare (protected oder private) Eigenschaften geschrieben werden
sollen.
</para>
<para>
<link linkend="object.get">__get</link> wird verwendet, um Daten aus
unzugreifbaren (protected oder private) Eigenschaften zu lesen.
</para>
<para>
<link linkend="object.isset">__isset</link> wird aufgerufen, indem
<function>isset</function> oder <function>empty</function>
auf unzugreifbare (protected oder private) Eigenschaften angewendet wird.
</para>
<para>
<link linkend="object.unset">__unset</link> wird aufgerufen, wenn
<function>unset</function> für unzugreifbaren (protected oder private)
Eigenschaften aufgerufen wird.
</para>
<para>
Der Parameter <varname>$name</varname> beinhaltet den Namen
der Eigenschaft, mit der interagiert wird. Der Parameter
<varname>$value</varname> der Funktion <link linkend="object.set">__set</link>
spezifiziert den Wert den die Eigenschaft <varname>$name</varname>
annehmen soll.
</para>
<para>
Ü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 <link linkend="language.oop5.static">static</link>
deklariert werden. Eine Warnung wird ausgegeben,
wenn eine dieser magischen Überladungsmethoden als
<literal>static</literal> deklariert ist.
</para>
<note>
<para>
Der Rückgabewert von <link linkend="object.set">__set</link> wird, aufgrund
der Behandlung des Zuweisungsoperators in PHP, ignoriert.
Aus ähnlichen Gründen wird <link linkend="object.get">__get</link> nicht
aufgerufen, wenn man Zuweisungen in etwa wie folgt verkettet:
<literal><![CDATA[ $a = $obj->b = 8; ]]></literal>
</para>
</note>
<note>
<para>
PHP ruft niemals eine überladene Methode von derselben überladenen
Methode aus auf. Das bedeutet zum Beispiel, dass
<code>return $this->foo</code> innerhalb von
<link linkend="object.get">__get()</link> &null; zurückgibt und ein
<constant>E_WARNING</constant> auslöst, wenn die Eigenschaft
<literal>foo</literal> nicht definiert ist, anstatt
<link linkend="object.get">__get()</link> ein zweites Mal aufzurufen. Es
ist jedoch möglich, dass eine überladene Methode implizit eine andere
überladene Methode aufruft (&zb; löst
<link linkend="object.set">__set()</link> den Aufruf von
<link linkend="object.get">__get()</link> aus).
</para>
</note>
<example>
<title>
Überladung von Eigenschaften mit den Methoden
<link linkend="object.get">__get</link>, <link linkend="object.set">__set</link>,
<link linkend="object.isset">__isset</link> und <link linkend="object.unset">__unset</link>
</title>
<programlisting role="php">
<![CDATA[
<?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;
}
public function __isset($name)
{
echo "Ist '$name' gesetzt?\n";
return isset($this->data[$name]);
}
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;
}
}
$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";
?>
]]>
</programlisting>
&example.outputs;
<screen role="php">
<![CDATA[
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
]]>
</screen>
</example>
</sect2>
<sect2 xml:id="language.oop5.overloading.methods">
<title>Überladung von Methoden</title>
<methodsynopsis xml:id="object.call">
<modifier>public</modifier> <type>mixed</type><methodname>__call</methodname>
<methodparam><type>string</type><parameter>name</parameter></methodparam>
<methodparam><type>array</type><parameter>arguments</parameter></methodparam>
</methodsynopsis>
<methodsynopsis xml:id="object.callstatic">
<modifier>public static</modifier> <type>mixed</type><methodname>__callStatic</methodname>
<methodparam><type>string</type><parameter>name</parameter></methodparam>
<methodparam><type>array</type><parameter>arguments</parameter></methodparam>
</methodsynopsis>
<para>
<link linkend="object.call">__call</link> wird aufgerufen, wenn eine unzugreifbare
Methode in einem Objekt aufgerufen wird.
</para>
<para>
<link linkend="object.callstatic">__callStatic</link> wird aufgerufen, wenn eine
unzugreifbare Methode in einem statischen Kontext aufgerufen wird.
</para>
<para>
Der Parameter <varname>$name</varname> ist der Name der aufgerufenen
Methode. Der Parameter <varname>$arguments</varname> beinhaltet ein
Array mit den Parametern, die der Methode <varname>$name</varname>
übergeben wurden.
</para>
<example>
<title>
Überladung von Methoden mit den methoden <link linkend="object.call">__call</link>
und <link linkend="object.callstatic">__callStatic</link>
</title>
<programlisting role="php">
<![CDATA[
<?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";
}
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');
MethodenTest::runTest('aus statischem Kontext auf');
?>
]]>
</programlisting>
&example.outputs;
<screen role="php">
<![CDATA[
Rufe die Objektmethode 'runTest' eines Objektes auf
Rufe die statische Methode 'runTest' aus statischem Kontext auf
]]>
</screen>
</example>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->