-
Notifications
You must be signed in to change notification settings - Fork 102
/
callable.xml
167 lines (140 loc) · 4.23 KB
/
callable.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
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: c897161ca5a62a887295c695adc161b8fde5d772 Maintainer: dallas Status: ready -->
<!-- CREDITS: Luffy -->
<sect1 xml:id="language.types.callable">
<title>Callback / Callable 类型</title>
<para>
回调可以通过 <type>callable</type> 类型声明来表示。
</para>
<para>
一些函数如 <function>call_user_func</function> 或
<function>usort</function> 可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。
</para>
<sect2 xml:id="language.types.callable.passing">
<title>传递</title>
<para>
PHP是将函数以<type>string</type>形式传递的。
可以使用任何内置或用户自定义函数,但除了语言结构例如:<function>array</function>,<function>echo</function>,<function>empty</function>,<function>eval</function>,<function>exit</function>,<function>isset</function>,<function>list</function>,<function>print</function>
或 <function>unset</function>。
</para>
<para>
一个已实例化的 <type>object</type> 的方法被作为 <type>array</type> 传递,下标 0 包含该 <type>object</type>,下标 1 包含方法名。
在同一个类里可以访问 protected 和 private 方法。
</para>
<para>
静态类方法可以不实例化 <type>object</type> 传递,只需要在下标为 0 的位置传递类名而不是
<type>object</type> ,或者传递 <literal>'ClassName::methodName'</literal>。
</para>
<para>
回调参数不仅可以使用普通的用户自定义函数,也接受 <link linkend="functions.anonymous">匿名函数</link>
和 <link linkend="functions.arrow">箭头函数</link>。
</para>
<note>
<para>
从 PHP 8.1.0 开始,还可以使用 <link linkend="functions.first_class_callable_syntax">First-class 可调用语法</link> 创建匿名函数。
</para>
</note>
<para>
通常情况下,任何实现了 <link linkend="object.invoke">__invoke()</link> 的对象都可以传入回调参数。
</para>
<para>
<example>
<title>回调函数示例</title>
<programlisting role="php">
<![CDATA[
<?php
// 回调函数示范
function my_callback_function() {
echo 'hello world!';
}
// 回调方法示范
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!';
}
}
// 类型 1:简单的回调
call_user_func('my_callback_function');
// 类型 2:静态类方法回调
call_user_func(array('MyClass', 'myCallbackMethod'));
// 类型 3:对象方法回调
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// 类型 4:静态类方法回调
call_user_func('MyClass::myCallbackMethod');
// 类型 5:父级静态类回调
class A {
public static function who() {
echo "A\n";
}
}
class B extends A {
public static function who() {
echo "B\n";
}
}
call_user_func(array('B', 'parent::who')); // A,从 PHP 8.2.0 起弃用。
// 类型 6:实现 __invoke 的对象用于回调
class C {
public function __invoke($name) {
echo 'Hello ', $name, "\n";
}
}
$c = new C();
call_user_func($c, 'PHP!');
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>使用 Closure 的示例</title>
<programlisting role="php">
<![CDATA[
<?php
// 闭包
$double = function($a) {
return $a * 2;
};
// 这是数字范围
$numbers = range(1, 5);
// 这里使用闭包作为回调,
// 将范围内的每个元素数值翻倍
$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
2 4 6 8 10
]]>
</screen>
</example>
</para>
¬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
-->