1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.1 $ -->
<reference id="ref.overload">
<title>Overload</title>
<titleabbrev>Surcharge d'objets</titleabbrev>
<partintro id="overload.partintro">
&warn.experimental;
<para>
Le but de cette extension est de permettre de maîtriser les appels
aux méthodes et aux membres d'un objet. Seule une fonction est définie
dans cette extension, <function>overload</function> qui demande le
nom de la classe qui supporte cet fonctionnalité. Cette classe doit
être pourvue des méthodes nécessaire au bon fonctionnement de l'extension,
c'est à dire : <literal>__get()</literal>, >literal>__set()</literal> et
<literal>__call()</literal>, qui servent respectivement à lire et modifier
un membre, et appeler une méthode. De cette manière, l'overloading
assure un contrôle sur les fonctions appelées. A l'intérieur de ces
méthodes, l'overloading est désactivé, pour que vous puissiez accéder
à l'objet.
</para>
<para>
Voici un exemple simple de fonctions utilisant <function>overload</function> :
<example>
<title>Overload avec une classe PHP</title>
<programlisting role="php">
<![CDATA[
<?php
class OO
{
var $a = 111;
var $elem = array('b' => 9, 'c' => 42);
// Fonction de callback pour la lecture de membre
function __get($prop_name, &$prop_value)
{
if (isset($this->elem[$prop_name])) {
$prop_value = $this->elem[$prop_name];
return true;
} else {
return false;
}
}
// Fonction de callback pour l'écriture de membre
function __set($prop_name, $prop_value)
{
$this->elem[$prop_name] = $prop_value;
return true;
}
}
// Ici, l'initiation de l'overload
overload('OO');
$o = new OO;
print "\$o->a: $o->a\n"; // print: $o->a:
print "\$o->b: $o->b\n"; // print: $o->b: 9
print "\$o->c: $o->c\n"; // print: $o->c: 42
print "\$o->d: $o->d\n"; // print: $o->d:
// ajouter une nouvelle valeur au membre $elem, en programmation OOP
$o->x = 56;
// instantiation de la classe stdclass (elle existe par défaut en PHP 4)
// $val n'est pas overloadée!
$val = new stdclass;
$val->prop = 555;
// Forcez "a" à être un tableau avec l'élément $val
// Mais _set() forcera cet élément dans le tableau $elem
$o->a = array($val);
var_dump($o->a[0]->prop);
?>
]]>
</programlisting>
</example>
</para>
<warning>
<para>
Comme c'est une extension expérimentale, tout ne fonctionne pas encore.
Il n'y a pas de support pour <literal>__call()</literal> actuellement,
et nouvs ne pouvez overloader que des accesseurs. Vous ne pouvez
pas appeler les fonctions d'overload de la classe, et
<literal>__set()</literal> ne fonctionne que pour un
seul niveau d'accesseur.
</para>
</warning>
</partintro>
<refentry id="function.overload">
<refnamediv>
<refname>overload</refname>
<refpurpose>Active la couche de contrôle des membres et méthodes</refpurpose>
</refnamediv>
<refsect1>
<title>Description</title>
<methodsynopsis>
<type>void</type><methodname>overload</methodname>
<methodparam choice="opt"><type>string</type><parameter>
class_name
</parameter></methodparam>
</methodsynopsis>
<para>
<function>overload</function> active le contrôle des
accesseurs et appels de méthodes pour la classe <parameter>class_name</parameter>.
<link linkend="overload.partintro">Voir un exemple dans l'introduction
de ce chapitre</link>.
</para>
</refsect1>
</refentry>
</reference>
<!-- 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:"../../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
-->
|