-
Notifications
You must be signed in to change notification settings - Fork 152
/
serialization.xml
116 lines (100 loc) · 4.12 KB
/
serialization.xml
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
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 70f392045a26b176f206013f00fa14b86440efd1 Maintainer: yannick Status: ready -->
<!-- Reviewed: no -->
<!-- TODO Rewrite to remove usage of "you" and talk about __serialize/_unserialize -->
<sect1 xml:id="language.oop5.serialization" xmlns="http://docbook.org/ns/docbook">
<title>Sérialiser des objets - des objets en session</title>
<titleabbrev>Sérialisation d'objets</titleabbrev>
<para>
<function>serialize</function> retourne une chaîne de caractères contenant
une représentation linéaire de n'importe quelle valeur qui
peut être stockée en PHP. <function>unserialize</function> peut utiliser cette
chaîne de caractères pour recréer la valeur originale de la variable à
partir de sa représentation linéaire. Utiliser <function>serialize</function>
pour sauvegarder un objet conservera toutes ses variables. Ses méthodes ne
seront pas conservées, seul le nom de la classe le sera.
</para>
<para>
Afin de pouvoir désérialiser (<function>unserialize</function>) un objet,
la classe de l'objet doit être définie, pour permettre sa reconstruction.
En d'autres termes, si vous avez un objet de la classe A et le sérialisez,
la représentation linéaire obtenue fera référence à la classe A et contiendra toutes
ses variables. Si vous voulez pouvoir désérialiser cette représentation linéaire dans un
endroit où la classe A n'est pas définie (dans un autre fichier par exemple),
alors vous devrez redéclarer la classe A avant de procéder à la désérialisation
de sa représentation linéaire. Cela peut-être fait, par exemple, en incluant le
fichier de définition de la classe, ou en utilisant la fonction
<function>spl_autoload_register</function>.
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
// A.php :
class A {
public $one = 1;
public function show_one() {
echo $this->one;
}
}
// page1.php :
include "A.php";
$a = new A;
$s = serialize($a);
// enregistre $s quelque part où page2.php peut le retrouver
file_put_contents('store', $s);
// page2.php :
// nous avons besoin de la définition de la classe
// pour qu'unserialize() fonctionne
include "A.php";
$s = file_get_contents('store');
$a = unserialize($s);
// appel de show_one() sur l'objet $a, affiche 1
$a->show_one();
?>
]]>
</programlisting>
</informalexample>
<para>
Si une application sérialise des objets, il est fortement recommandé, pour son usage
futur, que l'application inclut les définitions des classes des objets sérialisés
à chaque page. Ne pas faire ainsi pourrait aboutir à un objet désérialisé sans sa définition
de classe. PHP donnerait alors à cet objet une classe de type
<classname>__PHP_Incomplete_Class_Name</classname>, qui n'a pas de méthode, et
produirait un objet inutile.
</para>
<para>
Ainsi, dans l'exemple ci-dessus, si <varname>$a</varname> était enregistré dans la session
en ajoutant une clé à la variable super-globale <varname>$_SESSION</varname>, vous devriez inclure le fichier
<literal>A.php</literal> dans toutes vos pages, et pas seulement dans
<filename>page1.php</filename> et <filename>page2.php</filename>
</para>
<para>
Notez que vous pouvez également utiliser les événements de sérialisation et de désérialisation
sur un objet en utilisant les méthodes <link linkend="object.sleep">__sleep()</link> et
<link linkend="object.wakeup">__wakeup()</link>. L'utilisation de
<link linkend="object.sleep">__sleep()</link> vous permet également de seulement sérialiser
une partie des propriétés de l'objet.
</para>
</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
-->