mirror of
https://github.com/php/doc-de.git
synced 2026-04-25 07:58:12 +02:00
68ecfadebe
Thank you
344 lines
11 KiB
XML
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
|
|
-->
|