mirror of
https://github.com/sigmasternchen/php-doc-en
synced 2025-03-15 16:38:54 +00:00

Closes GH-173 git-svn-id: https://svn.php.net/repository/phpdoc/en/trunk@351340 c90b9560-bf6c-de11-be94-00142212c4b1
177 lines
4.1 KiB
XML
177 lines
4.1 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<sect1 xml:id="language.types.callable">
|
|
<title>Callbacks / Callables</title>
|
|
|
|
<para>
|
|
Callbacks can be denoted by the <type>callable</type> type declaration.
|
|
</para>
|
|
|
|
<para>
|
|
Some functions like <function>call_user_func</function> or
|
|
<function>usort</function> accept user-defined callback functions as a
|
|
parameter. Callback functions can not only be simple functions, but also
|
|
<type>object</type> methods, including static class methods.
|
|
</para>
|
|
|
|
<sect2 xml:id="language.types.callable.passing">
|
|
<title>Passing</title>
|
|
|
|
<para>
|
|
A PHP function is passed by its name as a <type>string</type>. Any built-in
|
|
or user-defined function can be used, except language constructs such as:
|
|
<function>array</function>, <function>echo</function>,
|
|
<function>empty</function>, <function>eval</function>,
|
|
<function>exit</function>, <function>isset</function>,
|
|
<function>list</function>, <function>print</function> or
|
|
<function>unset</function>.
|
|
</para>
|
|
|
|
<para>
|
|
A method of an instantiated <type>object</type> is passed as an
|
|
<type>array</type> containing an <type>object</type> at index 0 and the
|
|
method name at index 1. Accessing protected and private methods from
|
|
within a class is allowed.
|
|
</para>
|
|
|
|
<para>
|
|
Static class methods can also be passed without instantiating an
|
|
<type>object</type> of that class by either, passing the class name
|
|
instead of an <type>object</type> at index 0, or passing
|
|
<literal>'ClassName::methodName'</literal>.
|
|
</para>
|
|
|
|
<para>
|
|
Apart from common user-defined function,
|
|
<link linkend="functions.anonymous">anonymous functions</link> and
|
|
<link linkend="functions.arrow">arrow functions</link> can also be
|
|
passed to a callback parameter.
|
|
</para>
|
|
|
|
<para>
|
|
Generally, any object implementing <link linkend="object.invoke">__invoke()</link> can also
|
|
be passed to a callback parameter.
|
|
</para>
|
|
|
|
<para>
|
|
<example>
|
|
<title>
|
|
Callback function examples
|
|
</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
// An example callback function
|
|
function my_callback_function() {
|
|
echo 'hello world!';
|
|
}
|
|
|
|
// An example callback method
|
|
class MyClass {
|
|
static function myCallbackMethod() {
|
|
echo 'Hello World!';
|
|
}
|
|
}
|
|
|
|
// Type 1: Simple callback
|
|
call_user_func('my_callback_function');
|
|
|
|
// Type 2: Static class method call
|
|
call_user_func(array('MyClass', 'myCallbackMethod'));
|
|
|
|
// Type 3: Object method call
|
|
$obj = new MyClass();
|
|
call_user_func(array($obj, 'myCallbackMethod'));
|
|
|
|
// Type 4: Static class method call
|
|
call_user_func('MyClass::myCallbackMethod');
|
|
|
|
// Type 5: Relative static class method call
|
|
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
|
|
|
|
// Type 6: Objects implementing __invoke can be used as callables
|
|
class C {
|
|
public function __invoke($name) {
|
|
echo 'Hello ', $name, "\n";
|
|
}
|
|
}
|
|
|
|
$c = new C();
|
|
call_user_func($c, 'PHP!');
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
<example>
|
|
<title>
|
|
Callback example using a Closure
|
|
</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
// Our closure
|
|
$double = function($a) {
|
|
return $a * 2;
|
|
};
|
|
|
|
// This is our range of numbers
|
|
$numbers = range(1, 5);
|
|
|
|
// Use the closure as a callback here to
|
|
// double the size of each element in our
|
|
// range
|
|
$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
|
|
-->
|