Repository navigation
Expand file tree
/
Copy pathcallable.xml
More file actions
309 lines (269 loc) · 9 KB
/
Copy pathcallable.xml
File metadata and controls
309 lines (269 loc) · 9 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
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 312c0c7b39d0722c419f6784cbda24823220dfb3 Maintainer: simp Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.types.callable">
<title>Callables</title>
<simpara>
Ein Callable ist eine Referenz auf eine Funktion oder Methode, die einer
anderen Funktion als Argument übergeben wird.
Sie werden durch die Typdeklaration <type>callable</type> repräsentiert.
</simpara>
<informalexample>
<programlisting role="php" annotations="non-interactive">
<![CDATA[
<?php
function foo(callable $callback) {
$callback();
}
?>
]]>
</programlisting>
</informalexample>
<simpara>
Einige Funktionen akzeptieren Callback-Funktionen als Parameter, zum
Beispiel <function>array_map</function>, <function>usort</function> oder
<function>preg_replace_callback</function>.
</simpara>
<sect2 xml:id="language.types.callable.passing">
<title>Erstellung von Callables</title>
<simpara>
Ein Callable ist ein Typ, der etwas repräsentiert, das aufgerufen werden
kann. Callables können als Argumente an Funktionen oder Methoden übergeben
werden, die einen Callback-Parameter erwarten, oder sie können direkt
aufgerufen werden. Der Typ <type>callable</type> kann nicht als
Typdeklaration für Klasseneigenschaften verwendet werden. Verwenden Sie
stattdessen eine <classname>Closure</classname>-Typdeklaration.
</simpara>
<simpara>
Callables können auf verschiedene Arten erstellt werden:
</simpara>
<itemizedlist>
<listitem>
<simpara><classname>Closure</classname>-Objekt</simpara>
</listitem>
<listitem>
<simpara>Ein &string;, der den Namen einer Funktion oder Methode enthält</simpara>
</listitem>
<listitem>
<simpara>
Ein &array;, das einen Klassennamen oder ein <type>Object</type> an
Index 0 und den Methodennamen an Index 1 enthält
</simpara>
</listitem>
<listitem>
<simpara>
Ein &object;, das die magische Methode
<link linkend="object.invoke">__invoke()</link> implementiert
</simpara>
</listitem>
</itemizedlist>
<simpara>
Ein <classname>Closure</classname>-Objekt kann mit der Syntax für
<link linkend="functions.anonymous">anonyme Funktionen</link>, der Syntax
für <link linkend="functions.arrow">Pfeilfunktionen</link>, der
<link linkend="functions.first_class_callable_syntax">Syntax für
Callbacks als Objekte erster Klasse</link> oder mit der Methode
<methodname>Closure::fromCallable</methodname> erstellt werden.
</simpara>
<note>
<simpara>
Die <link linkend="functions.first_class_callable_syntax">Syntax für
Callbacks als Objekte erster Klasse</link> ist erst ab PHP 8.1.0
verfügbar.
</simpara>
</note>
<example>
<title>
Callback-Beispiel mit einem <classname>Closure</classname>
</title>
<programlisting role="php">
<![CDATA[
<?php
// Verwendung der Syntax für anonyme Funktionen
$double1 = function ($a) {
return $a * 2;
};
// Verwendung der Syntax für Callbacks als Objekte erster Klasse
function double_function($a) {
return $a * 2;
}
$double2 = double_function(...);
// Verwendung der Syntax für Pfeilfunktionen
$double3 = fn($a) => $a * 2;
// Verwendung von Closure::fromCallable
$double4 = Closure::fromCallable('double_function');
// Hier wird das Closure als Callback verwendet, um
// die Größe jedes Elements unseres Bereichs zu verdoppeln
$new_numbers = array_map($double1, range(1, 5));
print implode(' ', $new_numbers) . PHP_EOL;
$new_numbers = array_map($double2, range(1, 5));
print implode(' ', $new_numbers) . PHP_EOL;
$new_numbers = array_map($double3, range(1, 5));
print implode(' ', $new_numbers) . PHP_EOL;
$new_numbers = array_map($double4, range(1, 5));
print implode(' ', $new_numbers);
?>
]]>
</programlisting>
&example.outputs.81;
<screen>
<![CDATA[
2 4 6 8 10
2 4 6 8 10
2 4 6 8 10
2 4 6 8 10
]]>
</screen>
</example>
<simpara>
Ein Callable kann auch ein String sein, der den Namen einer Funktion oder
einer statischen Methode enthält. Jede eingebaute oder benutzerdefinierte
Funktion kann verwendet werden, außer Sprachkonstrukten wie:
<function>array</function>, <function>echo</function>,
<function>empty</function>, <function>eval</function>,
<function>isset</function>,
<function>list</function>, <function>print</function> oder
<function>unset</function>.
</simpara>
<simpara>
Statische Klassenmethoden können verwendet werden, ohne dass ein
<type>Object</type> dieser Klasse instantiiert werden muss, indem entweder
ein Array mit dem Klassennamen an Index 0 und dem Methodennamen an Index 1
erstellt wird, oder indem die spezielle Syntax mit dem
Bereichsauflösungsoperator <literal>::</literal> wie in
<literal>'ClassName::methodName'</literal> verwendet wird.
</simpara>
<simpara>
Eine Methode eines instantiierten <type>Object</type>s kann ein Callable
sein, wenn sie als Array mit dem <type>Object</type> an Index 0 und dem
Methodennamen an Index 1 angegeben wird.
</simpara>
<simpara>
Der Hauptunterschied zwischen einem <classname>Closure</classname>-Objekt
und dem Typ <type>callable</type> besteht darin, dass ein
<classname>Closure</classname>-Objekt unabhängig vom Geltungsbereich ist
und immer aufgerufen werden kann, während ein Callable-Typ vom
Geltungsbereich abhängig sein kann und möglicherweise nicht direkt aufgerufen
werden kann. <classname>Closure</classname> ist die bevorzugte Art,
Callables zu erstellen.
</simpara>
<note>
<simpara>
Während <classname>Closure</classname>-Objekte an den Geltungsbereich
gebunden sind, in dem sie erstellt werden, werden Callables, die
Klassenmethoden als Strings oder Arrays referenzieren, in dem
Geltungsbereich aufgelöst, in dem sie aufgerufen werden. Um aus einer
privaten oder geschützten Methode ein Callable zu erstellen, das dann
von außerhalb des Geltungsbereichs der Klasse aufgerufen werden kann,
verwenden Sie <methodname>Closure::fromCallable</methodname> oder die
<link linkend="functions.first_class_callable_syntax">Syntax für
Callbacks als Objekte erster Klasse</link>.
</simpara>
</note>
<simpara>
PHP erlaubt die Erstellung von Callables, die als Callback-Argument
verwendet, aber nicht direkt aufgerufen werden können. Dabei handelt es
sich um kontextabhängige Callables, die eine Klassenmethode in der
Vererbungshierarchie einer Klasse referenzieren, zum Beispiel
<literal>'parent::method'</literal> oder
<literal>["static", "method"]</literal>.
</simpara>
<note>
<simpara>
Seit PHP 8.2.0 sind kontextabhängige Callables veraltet. Entfernen Sie
die Kontextabhängigkeit, indem Sie
<literal>'parent::method'</literal> durch
<literal>parent::class . '::method'</literal> ersetzen, oder verwenden
Sie die <link linkend="functions.first_class_callable_syntax">Syntax für
Callbacks als Objekte erster Klasse</link>.
</simpara>
</note>
<example>
<title>
Verschiedene Arten von Callables mit
<function>call_user_function</function> aufrufen
</title>
<programlisting role="php">
<![CDATA[
<?php
// Eine Beispiel-Callback-Funktion
function my_callback_function() {
echo 'hello world!', PHP_EOL;
}
// Eine Beispiel-Callback-Methode
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!', PHP_EOL;
}
}
// Typ 1: Einfaches Callback
call_user_func('my_callback_function');
// Typ 2: Statischer Methodenaufruf
call_user_func(['MyClass', 'myCallbackMethod']);
// Typ 3: Aufruf einer Objektmethode
$obj = new MyClass();
call_user_func([$obj, 'myCallbackMethod']);
// Typ 4: Statischer Methodenaufruf
call_user_func('MyClass::myCallbackMethod');
// Typ 5: Statischer Methodenaufruf mit dem Schlüsselwort ::class
call_user_func([MyClass::class, 'myCallbackMethod']);
// Typ 6: Relativer statischer Methodenaufruf
class A {
public static function who() {
echo 'A', PHP_EOL;
}
}
class B extends A {
public static function who() {
echo 'B', PHP_EOL;
}
}
call_user_func(['B', 'parent::who']); // seit PHP 8.2.0 veraltet
// Typ 7: Objekte die __invoke implementieren können als Callable verwendet werden
class C {
public function __invoke($name) {
echo 'Hello ', $name;
}
}
$c = new C();
call_user_func($c, 'PHP!');
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
hello world!
Hello World!
Hello World!
Hello World!
Hello World!
Deprecated: Callables of the form ["B", "parent::who"] are deprecated in script on line 41
A
Hello PHP!
]]>
</screen>
</example>
¬e.func-callback-exceptions;
</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
-->