mirror of
https://github.com/macintoshplus/doc-fr.git
synced 2026-03-24 08:52:09 +01:00
334 lines
11 KiB
XML
334 lines
11 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: 2ab7e9d763666526942ed4477c4f876beb160892 Maintainer: yannick Status: ready -->
|
|
<!-- Reviewed: no -->
|
|
<sect1 xml:id="language.oop5.overloading" xmlns="http://docbook.org/ns/docbook">
|
|
<title>Surcharge magique</title>
|
|
|
|
<para>
|
|
La surcharge magique en PHP permet de "créer" dynamiquement des
|
|
propriétés et des méthodes. Ces entités dynamiques sont
|
|
traitées via des méthodes magiques établies que l'on peut positionner
|
|
dans une classe pour divers types d'actions.
|
|
</para>
|
|
|
|
<para>
|
|
Les méthodes magiques de surcharge sont appelées lors de l'interaction
|
|
avec des propriétés ou des méthodes qui n'ont pas été déclarées
|
|
ou ne sont pas <link linkend="language.oop5.visibility">visibles</link>
|
|
dans le contexte courant. Le reste de cette section utilise
|
|
les termes de <quote>propriétés inaccessibles</quote> et de
|
|
<quote>méthodes inaccessibles</quote> pour se référer à cette
|
|
combinaison de déclaration et de visibilité.
|
|
</para>
|
|
|
|
<para>
|
|
Toutes les méthodes magiques de surcharge doivent être définies comme
|
|
<literal>public</literal>.
|
|
</para>
|
|
|
|
<note>
|
|
<para>
|
|
Aucun des arguments de ces méthodes magiques ne peut être
|
|
<link linkend="functions.arguments.by-reference">passé par
|
|
référence</link>.
|
|
</para>
|
|
</note>
|
|
|
|
<note>
|
|
<para>
|
|
L'interprétation PHP de la <quote>surcharge</quote> est
|
|
différente de celle de la plupart des langages orientés objet.
|
|
La surcharge, habituellement, fournit la possibilité d'avoir
|
|
plusieurs méthodes portant le même nom mais avec une quantité
|
|
et des types différents d'arguments.
|
|
</para>
|
|
</note>
|
|
|
|
<sect2 xml:id="language.oop5.overloading.members">
|
|
<title>Surcharge de propriétés</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> est sollicitée lors de l'écriture de données
|
|
vers des propriétés inaccessibles (protégées ou privées) ou non existante.
|
|
</para>
|
|
|
|
<para>
|
|
<link linkend="object.get">__get()</link> est appelée pour lire des données depuis
|
|
des propriétés inaccessibles (protégées ou privées) ou non existante.
|
|
</para>
|
|
|
|
<para>
|
|
<link linkend="object.isset">__isset()</link> est sollicitée lorsque
|
|
<function>isset</function> ou <function>empty</function> sont appelées sur
|
|
des propriétés inaccessibles (protégées ou privées) ou non existante.
|
|
</para>
|
|
|
|
<para>
|
|
<link linkend="object.unset">__unset()</link> est invoquée lorsque
|
|
<function>unset</function> est appelée sur des propriétés inaccessibles
|
|
(protégées ou privées) ou non existante.
|
|
</para>
|
|
|
|
<para>
|
|
L'argument <varname>$name</varname> est le nom de la propriété avec laquelle on interagit.
|
|
L'argument <varname>$value</varname> de la méthode <link linkend="object.set">__set()</link>
|
|
spécifie la valeur à laquelle la propriété <varname>$name</varname> devrait être définie.
|
|
</para>
|
|
|
|
<para>
|
|
La surcharge de propriétés ne fonctionne que dans les contextes objets.
|
|
Ces méthodes magiques ne seront pas lancées en contexte statique.
|
|
Par conséquent, ces méthodes ne devraient pas être déclarées comme
|
|
<link linkend="language.oop5.static">statiques</link>.
|
|
Un avertissement est levée si une des méthodes magiques est déclarée comme statique.
|
|
</para>
|
|
|
|
<note>
|
|
<para>
|
|
La valeur retournée par <link linkend="object.set">__set()</link>
|
|
est ignorée en raison de la façon dont PHP traite l'opérateur d'affectation.
|
|
De la même façon, <link linkend="object.get">__get()</link> n'est jamais appelée lors
|
|
d'un enchaînement d'affectation, comme ceci :
|
|
<literal><![CDATA[ $a = $obj->b = 8; ]]></literal>
|
|
</para>
|
|
</note>
|
|
|
|
<note>
|
|
<para>
|
|
PHP n'appellera pas une méthode surchargée à partir de la même méthode surchargée.
|
|
Cela signifie, par exemple, qu'écrire <code>return $this->foo</code> à l'intérieur
|
|
de <link linkend="object.get">__get()</link> retournera <literal>null</literal>
|
|
et lèvera un <constant>E_WARNING</constant> s'il n'y a pas de propriété <literal>foo</literal> définie,
|
|
plutôt que d'appeler <link linkend="object.get">__get()</link> une deuxième fois.
|
|
Toutefois, les méthodes de surcharge peuvent invoquer d'autres méthodes de surcharge de manière implicite
|
|
(par exemple, <link linkend="object.set">__set()</link> déclenchant <link linkend="object.get">__get()</link>).
|
|
</para>
|
|
</note>
|
|
|
|
<example>
|
|
<title>Exemple de surcharge de propriétés avec les méthodes
|
|
<link linkend="object.get">__get()</link>,
|
|
<link linkend="object.set">__set()</link>,
|
|
<link linkend="object.isset">__isset()</link> et
|
|
<link linkend="object.unset">__unset()</link>
|
|
</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
class PropertyTest
|
|
{
|
|
/** Variable pour les données surchargées. */
|
|
private $data = array();
|
|
|
|
/** La surcharge n'est pas utilisée sur les propriétés déclarées. */
|
|
public $declared = 1;
|
|
|
|
/** La surcharge n'est lancée que lorsque l'on accède à cette propriété depuis l'extérieur de la classe. */
|
|
private $hidden = 2;
|
|
|
|
public function __set($name, $value)
|
|
{
|
|
echo "Définition de '$name' à la valeur '$value'\n";
|
|
$this->data[$name] = $value;
|
|
}
|
|
|
|
public function __get($name)
|
|
{
|
|
echo "Récupération de '$name'\n";
|
|
if (array_key_exists($name, $this->data)) {
|
|
return $this->data[$name];
|
|
}
|
|
|
|
$trace = debug_backtrace();
|
|
trigger_error(
|
|
'Propriété non-définie via __get() : ' . $name .
|
|
' dans ' . $trace[0]['file'] .
|
|
' à la ligne ' . $trace[0]['line'],
|
|
E_USER_NOTICE);
|
|
return null;
|
|
}
|
|
|
|
public function __isset($name)
|
|
{
|
|
echo "Est-ce que '$name' est défini ?\n";
|
|
return isset($this->data[$name]);
|
|
}
|
|
|
|
public function __unset($name)
|
|
{
|
|
echo "Effacement de '$name'\n";
|
|
unset($this->data[$name]);
|
|
}
|
|
|
|
/** Ce n'est pas une méthode magique, nécessaire ici que pour l'exemple. */
|
|
public function getHidden()
|
|
{
|
|
return $this->hidden;
|
|
}
|
|
}
|
|
|
|
|
|
echo "<pre>\n";
|
|
|
|
$obj = new PropertyTest;
|
|
|
|
$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 "Manipulons maintenant la propriété privée nommée 'hidden' :\n";
|
|
echo "'hidden' est visible depuis la classe, donc __get() n'est pas utilisée...\n";
|
|
echo $obj->getHidden() . "\n";
|
|
echo "'hidden' n'est pas visible en dehors de la classe, donc __get() est utilisée...\n";
|
|
echo $obj->hidden . "\n";
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen role="php">
|
|
<![CDATA[
|
|
Définition de 'a' à '1'
|
|
Récupération de 'a'
|
|
1
|
|
|
|
Est-ce que 'a' est défini ?
|
|
bool(true)
|
|
Effacement de 'a'
|
|
Est-ce que 'a' est défini ?
|
|
bool(false)
|
|
|
|
1
|
|
|
|
Manipulons maintenant la propriété privée nommée 'hidden' :
|
|
'hidden' est visible depuis la classe, donc __get() n'est pas utilisée...
|
|
2
|
|
'hidden' n'est pas visible en dehors de la classe, donc __get() est utilisée...
|
|
Récupération de 'hidden'
|
|
|
|
|
|
Notice: Propriété non-définie via __get() : hidden dans <file> à la ligne 64 dans <file> à la ligne 28
|
|
]]>
|
|
</screen>
|
|
|
|
</example>
|
|
</sect2>
|
|
|
|
<sect2 xml:id="language.oop5.overloading.methods">
|
|
<title>Surcharge de méthodes</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> est appelée lorsque l'on invoque des
|
|
méthodes inaccessibles dans un contexte objet.
|
|
</para>
|
|
|
|
<para>
|
|
<link linkend="object.callstatic">__callStatic()</link> est lancée lorsque l'on invoque
|
|
des méthodes inaccessibles dans un contexte statique.
|
|
</para>
|
|
|
|
<para>
|
|
L'argument <varname>$name</varname> est le nom de la méthode appelée.
|
|
L'argument <varname>$arguments</varname> est un tableau contenant
|
|
les paramètres passés à la méthode <varname>$name</varname>.
|
|
</para>
|
|
|
|
<example>
|
|
<title>Surcharge de méthodes avec
|
|
<link linkend="object.call">__call()</link> et
|
|
<link linkend="object.callstatic">__callStatic()</link></title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
class MethodTest
|
|
{
|
|
public function __call($name, $arguments)
|
|
{
|
|
// Note : la valeur de $name est sensible à la casse.
|
|
echo "Appel de la méthode '$name' "
|
|
. implode(', ', $arguments). "\n";
|
|
}
|
|
|
|
public static function __callStatic($name, $arguments)
|
|
{
|
|
// Note : la valeur de $name est sensible à la casse.
|
|
echo "Appel de la méthode statique '$name' "
|
|
. implode(', ', $arguments). "\n";
|
|
}
|
|
}
|
|
|
|
$obj = new MethodTest;
|
|
$obj->runTest('dans un contexte objet');
|
|
|
|
MethodTest::runTest('dans un contexte static');
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen role="php">
|
|
<![CDATA[
|
|
Appel de la méthode 'runTest' dans un contexte objet
|
|
Appel de la méthode statique 'runTest' dans un contexte static
|
|
]]>
|
|
</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
|
|
-->
|