-
Notifications
You must be signed in to change notification settings - Fork 63
Expand file tree
/
Copy pathcreate-function.xml
More file actions
285 lines (270 loc) · 7.56 KB
/
Copy pathcreate-function.xml
File metadata and controls
285 lines (270 loc) · 7.56 KB
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
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 39752929cd4ab78db8a7310dfb328444c558df99 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes -->
<refentry xml:id="function.create-function" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>create_function</refname>
<refpurpose>Crea una función anónima</refpurpose>
</refnamediv>
<refsynopsisdiv>
&warn.deprecated.function-7-2-0.removed-8-0-0;
</refsynopsisdiv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>string</type><methodname>create_function</methodname>
<methodparam><type>string</type><parameter>args</parameter></methodparam>
<methodparam><type>string</type><parameter>code</parameter></methodparam>
</methodsynopsis>
<para>
<function>create_function</function> crea una función anónima,
a partir de los argumentos pasados, y devuelve un nombre de función único.
</para>
<caution>
<para>
Esta función, internamente, utiliza la función
<function>eval</function> y por lo tanto los requisitos
de seguridad son idénticos a los de la función <function>eval</function>.
Además, el rendimiento no es óptimo y el uso de memoria
es significativo.
</para>
<para>
Una <link linkend="functions.anonymous">función anónima</link> nativa
debería ser utilizada en su lugar.
</para>
</caution>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
Generalmente, los argumentos <parameter>args</parameter> son
presentados en forma de una cadena entre comillas simples, y la misma
recomendación aplica para <parameter>code</parameter>.
La razón de usar comillas simples es proteger
los nombres de variables del reemplazo por su valor. Si se usan
comillas dobles, no se olvide de escapar
los nombres de variables (i.e. <literal>\$avar</literal>).
<variablelist>
<varlistentry>
<term><parameter>args</parameter></term>
<listitem>
<para>
Los argumentos de la función.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>code</parameter></term>
<listitem>
<para>
El código de la función.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Devuelve un nombre de función único, en forma de una &string;,
o &false; si ocurre un error.
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>
Creación de una función anónima con <function>create_function</function>
</title>
<para>
Esta función puede ser utilizada para (por ejemplo) crear
una función a partir de información recolectada
durante la ejecución:
</para>
<programlisting role="php">
<![CDATA[
<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "Nueva función anónima: $newfunc\n";
echo $newfunc(2, M_E) . "\n";
// mostrará:
// Nueva función anónima: lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
?>
]]>
</programlisting>
</example>
</para>
<para>
O, para poder aplicar una función genérica
a una lista de argumentos.
</para>
<para>
<example>
<title>
Procesamiento genérico por función con <function>create_function</function>
</title>
<programlisting role="php">
<![CDATA[
<?php
function process($var1, $var2, $farr)
{
foreach ($farr as $f) {
echo $f($var1, $var2) . "\n";
}
}
// Creación de una serie de funciones matemáticas
$f1 = 'if ($a >=0) {return "b*a^2 = ".$b*sqrt($a);} else {return false;}';
$f2 = "return \"min(b^2+a, a^2,b) = \".min(\$a*\$a+\$b,\$b*\$b+\$a);";
$f3 = 'if ($a > 0 && $b != 0) {return "ln(a)/b = ".log($a)/$b; } else { return false; }';
$farr = array(
create_function('$x,$y', 'return "un poco de trigonometría: ".(sin($x) + $x*cos($y));'),
create_function('$x,$y', 'return "una hipotenusa: ".sqrt($x*$x + $y*$y);'),
create_function('$a,$b', $f1),
create_function('$a,$b', $f2),
create_function('$a,$b', $f3)
);
echo "\nUso de la primera lista de funciones anónimas\n";
echo "parámetros: 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);
// Ahora una lista de funciones sobre cadenas de caracteres
$garr = array(
create_function('$b,$a', 'if (strncmp($a, $b, 3) == 0) return "** \"$a\" '.
'and \"$b\"\n** Look the same to me! (looking at the first 3 chars)";'),
create_function('$a,$b', 'return "CRCs: " . crc32($a) . ", ".crc32($b);'),
create_function('$a,$b', 'return "similaridad (a,b) = " . similar_text($a, $b, &$p) . "($p%)";')
);
echo "\nUso de la segunda lista de funciones anónimas\n";
process("Twas brilling and the slithy toves", "Twas the night", $garr);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Uso de la primera lista de funciones anónimas
parámetros: 2.3445, M_PI
un poco de trigonometría: -1.6291725057799
una hipotenusa: 3.9199852871011
b*a^2 = 4.8103313314525
min(b^2+a, a^2,b) = 8.6382729035898
ln(a)/b = 0.27122299212594
Uso de la segunda lista de funciones anónimas
** "Twas the night" and "Twas brilling and the slithy toves"
** Estas cadenas se parecen! (mirando los tres primeros caracteres)
CRCs: -725381282, 342550513
similaridad (a,b) = 11(45.833333333333%)
]]>
</screen>
</example>
</para>
<para>
Pero el uso más común de las funciones lambda es la
función de devolución de llamada, por ejemplo, al utilizar
<function>array_walk</function> o <function>usort</function>
</para>
<para>
<example>
<title>Uso de funciones anónimas como función de devolución de llamada</title>
<programlisting role="php">
<![CDATA[
<?php
$av = array("la ", "una ", "cette ", "une certaine ");
array_walk($av, create_function('&$v,$k', '$v = $v . "maison";'));
print_r($av);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Array
(
[0] => la maison
[1] => une maison
[2] => cette maison
[3] => une certaine maison
)
]]>
</screen>
<para>
un array de cadenas de caracteres ordenadas de la más corta a la más larga
</para>
<programlisting role="php">
<![CDATA[
<?php
$sv = array("petite", "longue", "une très longue chaîne", "une phrase toute entière");
print_r($sv);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Array
(
[0] => petite
[1] => longue
[2] => une très longue chaîne
[3] => une phrase toute entière
)
]]>
</screen>
<para>
ordenadas de la más larga a la más corta
</para>
<programlisting role="php">
<![CDATA[
<?php
usort($sv, create_function('$a,$b','return strlen($b) - strlen($a);'));
print_r($sv);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Array
(
[0] => une phrase toute entière
[1] => une très longue chaîne
[2] => longue
[3] => petite
)
]]>
</screen>
</example>
</para>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><link linkend="functions.anonymous">Funciones anónimas</link></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- 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
-->