-
Notifications
You must be signed in to change notification settings - Fork 50
/
interfaces.xml
244 lines (222 loc) · 5.86 KB
/
interfaces.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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 4317fec7555dd42621f88162cc5068092e5c5cfb Maintainer: seros Status: ready -->
<!-- Reviewed: no Maintainer: seros -->
<sect1 xml:id="language.oop5.interfaces" xmlns="http://docbook.org/ns/docbook">
<title>Interfaces de objetos</title>
<para>
Las interfaces de objetos permiten crear código con el cual especificar qué
métodos deben ser implementados por una clase, sin tener que definir cómo estos
métodos son manipulados.
</para>
<para>
Las interfaces se definen de la misma manera que una clase, aunque reemplazando la palabra reservada
<literal>class</literal> por la palabra reservada <literal>interface</literal> y sin que ninguno de sus
métodos tenga su contenido definido.
</para>
<para>
Todos los métodos declarados en una interfaz deben ser públicos, ya que ésta
es la naturaleza de una interfaz.
</para>
<sect2 xml:id="language.oop5.interfaces.implements">
<title><literal>implements</literal></title>
<para>
Para implementar una interfaz, se utiliza el operador <literal>implements</literal>.
Todos los métodos en una interfaz deben ser implementados dentro de la clase; el no
cumplir con esta regla resultará en un error fatal. Las clases pueden implementar
más de una interfaz si se deseara, separándolas cada una por una coma.
</para>
<note>
<para>
Antes de PHP 5.3.9, una clase no puede implementar dos interfaces que
especifiquen un método con el mismo nombre, ya que podría causar ambigüedad.
Las versiones más recientes de PHP permiten esto siempre y cuando los métodos duplicados
tengan la misma firma.
</para>
</note>
<note>
<para>
Las interfaces se pueden extender al igual que las clases utilizando el operador
<link linkend="language.oop5.inheritance">extends</link>.
</para>
</note>
<note>
<para>
La clase que implemente una interfaz debe utilizar exactamente las mismas
estructuras de métodos que fueron definidos en la interfaz. De no cumplir
con esta regla, se generará un error fatal.
</para>
</note>
</sect2>
<sect2 xml:id="language.oop5.interfaces.constants">
<title><literal>Constantes</literal></title>
<para>
Es posible tener constantes dentro de las interfaces. Las constantes de interfaces
funcionan como las <link linkend="language.oop5.constants">constantes de clases</link>
excepto porque no pueden ser sobrescritas por una clase/interfaz que las herede.
</para>
</sect2>
<sect2 xml:id="language.oop5.interfaces.examples">
&reftitle.examples;
<example xml:id="language.oop5.interfaces.examples.ex1">
<title>Ejemplo de interfaz</title>
<programlisting role="php">
<![CDATA[
<?php
// Declarar la interfaz 'iTemplate'
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// Implementar la interfaz
// Ésto funcionará
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
// Ésto no funcionará
// Error fatal: La Clase BadTemplate contiene un método abstracto
// y por lo tanto debe declararse como abstracta (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
}
?>
]]>
</programlisting>
</example>
<example xml:id="language.oop5.interfaces.examples.ex2">
<title>Interfaces extensibles</title>
<programlisting role="php">
<![CDATA[
<?php
interface a
{
public function foo();
}
interface b extends a
{
public function baz(Baz $baz);
}
// Ésto sí funcionará
class c implements b
{
public function foo()
{
}
public function baz(Baz $baz)
{
}
}
// Ésto no funcionará y resultará en un error fatal
class d implements b
{
public function foo()
{
}
public function baz(Foo $foo)
{
}
}
?>
]]>
</programlisting>
</example>
<example xml:id="language.oop5.interfaces.examples.ex3">
<title>Herencia múltiple de interfaces</title>
<programlisting role="php">
<![CDATA[
<?php
interface a
{
public function foo();
}
interface b
{
public function bar();
}
interface c extends a, b
{
public function baz();
}
class d implements c
{
public function foo()
{
}
public function bar()
{
}
public function baz()
{
}
}
?>
]]>
</programlisting>
</example>
<example xml:id="language.oop5.interfaces.examples.ex4">
<title>Interfaces con constantes</title>
<programlisting role="php">
<![CDATA[
<?php
interface a
{
const b = 'Interface constant';
}
// Imprime: Interface constant
echo a::b;
// Sin embargo ésto no funcionará ya que no está permitido
// sobrescribir constantes
class b implements a
{
const b = 'Class constant';
}
?>
]]>
</programlisting>
</example>
<para>
Una interfaz, junto con la determinación de tipos, proveen una buena forma de asegurarse
que determinado objeto contiene métodos particulares. Vea el operador
<link linkend="language.operators.type">instanceof</link> y la
<link linkend="language.types.declarations">declaración de tipos</link>.
</para>
</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
-->