-
Notifications
You must be signed in to change notification settings - Fork 109
Expand file tree
/
Copy pathis-callable.xml
More file actions
218 lines (195 loc) · 5.59 KB
/
is-callable.xml
File metadata and controls
218 lines (195 loc) · 5.59 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
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 32c55286c8739fd20de9c8624473b2f3268de68e Maintainer: HonestQiao Status: ready -->
<!-- CREDITS: mowangjuanzi -->
<refentry xml:id="function.is-callable" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>is_callable</refname>
<refpurpose>
验证值是否可以在当前范围内作为函数调用
</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>bool</type><methodname>is_callable</methodname>
<methodparam><type>mixed</type><parameter>value</parameter></methodparam>
<methodparam choice="opt"><type>bool</type><parameter>syntax_only</parameter><initializer>&false;</initializer></methodparam>
<methodparam choice="opt"><type>string</type><parameter role="reference">callable_name</parameter><initializer>&null;</initializer></methodparam>
</methodsynopsis>
<para>
验证 <parameter>value</parameter> 是 <type>callable</type>,或者其可以使用
<function>call_user_func</function> 函数调用。
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>value</parameter></term>
<listitem>
<para>
要验证的值。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>syntax_only</parameter></term>
<listitem>
<para>
如果设置为 &true;,则函数仅验证 <parameter>value</parameter>
是函数还是方法。它将拒绝任何不是<link linkend="object.invoke">可调用</link>对象、<classname>Closure</classname>、&string;
或者不能用作回调的无效结构的数组的值。有效的可调用数组只有
2 个条目,第一个是对象或者字符串,第二个是字符串。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>callable_name</parameter></term>
<listitem>
<para>
接受 “callable 名称”,例如 <literal>"SomeClass::someMethod"</literal>。注意,尽管
<literal>SomeClass::someMethod()</literal> 暗示是可调用静态方法,但事实并非如此。
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
如果 <parameter>value</parameter> 可调用则返回 &true;,否则返回 &false;。
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>检查字符串是否可以作为函数调用</title>
<programlisting role="php">
<![CDATA[
<?php
function someFunction() {}
$functionVariable = 'someFunction';
var_dump(is_callable($functionVariable, false, $callable_name));
var_dump($callable_name);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
bool(true)
string(12) "someFunction"
]]>
</screen>
</example>
<example>
<title>检查数组是否可以作为函数调用</title>
<programlisting role="php">
<![CDATA[
<?php
class SomeClass
{
public function someMethod() {}
}
$anObject = new SomeClass();
$methodVariable = [$anObject, 'someMethod'];
var_dump(is_callable($methodVariable, true, $callable_name));
var_dump($callable_name);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
bool(true)
string(21) "SomeClass::someMethod"
]]>
</screen>
</example>
<example>
<title><function>is_callable</function> 和构造方法</title>
<simpara>
尽管构造方法是创建对象时调用的方法,但它们不是静态方法,<function>is_callable</function>
将对它们返回 &false;。无法使用 <function>is_callable</function> 检查类是否可以从当前作用域实例化。
</simpara>
<programlisting role="php">
<![CDATA[
<?php
class Foo
{
public function __construct() {}
public function foo() {}
}
var_dump(
is_callable(['Foo', '__construct']),
is_callable(['Foo', 'foo'])
);
$foo = new Foo();
var_dump(is_callable([$foo, '__construct']));
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
bool(false)
bool(false)
bool(true)
]]>
</screen>
</example>
</para>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
<simplelist>
<member>
如果对象实现了 <link linkend="object.invoke">__invoke()</link> 且该方法在当前作用域可见,则始终可调用。
</member>
<member>
如果类名实现了 <link linkend="object.callstatic">__callStatic()</link>,则可调用。
</member>
<member>
如果对象实现 <link linkend="object.call">__call()</link>,则此函数对该对象的任何方法将返回
&true;,即使该方法没有定义。
</member>
<member>
如果使用类名调用此函数,则会触发自动加载。
</member>
</simplelist>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>call_user_func</function></member>
<member><function>function_exists</function></member>
<member><function>method_exists</function></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
-->