目录

传参不定

function more_args(){
    $args=func_get_args();//将所有传递进来的参数封装成一个数组
    echo $args[0];//输出第一个变量
}

变量函数

function varfunc( $a, $b ) {
    return $a + $b;
}
$a = 'varfunc';
echo $a( 2, 56 );

回调函数

将一个函数名当做参数传入,执行

function   filter($fun){
    $i=2;
    return  $fun($i);
}
function one($i){
    retrun  $i*$i;
}
filter(one);// 这里将回调函数的名称当作变量,传入里面!

递归函数

function A($i){
    if($i<=1) return $i;
    return A($i-1)*$i;
}

匿名函数

也叫闭包(Closures), 经常被用来临时性地创建一个无名函数,用于回调函数等用途。

$func = function($arg)
{
    print $arg;
};

$func("Hello World");

以上代码定义了一个匿名函数,并赋值给了 $func.

可以看到定义匿名函数依旧使用 function 关键字,只不过省略了函数名,直接是参数列表。

然后我们又调用了 $func 所储存的匿名函数。

$input = array(1, 2, 3, 4, 5, 6);

// Creates a new anonymous function and assigns it to a variable
$filter_even = function($item) {
    return ($item % 2) == 0;
};

// Built-in array_filter accepts both the data and the function
$output = array_filter($input, $filter_even);

// The function doesn't need to be assigned to a variable. This is valid too:
$output = array_filter($input, function($item) {
    return ($item % 2) == 0;
});

print_r($output);

匿名函数还可以用 use 关键字来捕捉外部变量

function arrayPlus($array, $num)
{
    array_walk($array, function(&$v) use($num){
        $v += $num;
    });
}

上面的代码定义了一个 arrayPlus() 函数(这不是匿名函数), 它会将一个数组($array)中的每一项,加上一个指定的数字($num).
在 arrayPlus() 的实现中,我们使用了 array_walk() 函数,它会为一个数组的每一项执行一个回调函数,即我们定义的匿名函数。
在匿名函数的参数列表后,我们用 use 关键字将匿名函数外的 $num 捕捉到了函数内,以便知道到底应该加上多少。

php 闭包使用 use 关键字

function criteria_greater_than($min)
{
    return function($item) use ($min) {
        return $item > $min;
    };
}

$input = array(1, 2, 3, 4, 5, 6);

// Use array_filter on a input with a selected filter function
$output = array_filter($input, criteria_greater_than(3));

print_r($output); // items > 3

call_user_func_array 调用用户函数

function foobar($arg, $arg2) {
    echo __FUNCTION__, " got $arg and $arg2\n";
}
class foo {
    function bar($arg, $arg2) {
        echo __METHOD__, " got $arg and $arg2\n";
    }
}

call_user_func_array("foobar", ["one", "two"]); // 调用函数
$foo = new foo;
call_user_func_array( [$foo, "bar"], ["three", "four"]); // 调用方法

namespace Foobar;
class Foo {
    static public function test($name) {
        print "Hello {$name}!\n";
    }
}
call_user_func_array( __NAMESPACE__ .'\Foo::test', ['Hannes']);
call_user_func_array( [ __NAMESPACE__ .'\Foo', 'test'], ['Philip']);

匿名函数 / 闭包 Closures

# 不定参函数
function more_args() {
    $args = func_get_args();    // 返回包含所有参数的数组
    echo $args[0];
}

// 变量函数
function varfunc( $a, $b ) {
    return $a + $b;
}
$a = 'varfunc';
echo $a( 2, 56 );
$func = function( $arg ) {
    print $arg;
};
$func("Hello World");

// array_filter 要求传递 一个 function( $item ) 类型函数
$input = array(1, 2, 3, 4, 5, 6);
$output = array_filter( $input, function( $item ) {
    return ( $item % 2 ) == 0;
});

// use 关键字 捕捉外部变量
function arrayPlus( $array, $num ) {
    // 为一个数组的每一项执行一个回调函数
    // 将匿名函数外的 $num 捕捉到了函数内
    array_walk($array, function( &$v ) use( $num ) {
        $v += $num;
    });
}
register_shutdown_function( ['core', 'handleShutdown'] );   // 正常/异常 退出时 调用
set_exception_handler( ['core', 'handleException'] );       // 设置异常处理函数
set_error_handler( ['core', 'handleError'] );               // 设置错误处理函数

call_user_func_array 调用用户函数

call_user_func( 'myFunction' );                 // myFunction();
call_user_func( [$myObj,'method_name'], 20 );   // $myObj -> method_name(20);
call_user_func_array( [$obj,'method'], $args ); // $obj -> method( $arg1, $arg2 );
function foobar($arg, $arg2) {
    echo __FUNCTION__, " got $arg and $arg2\n";
}
class foo {
    function bar($arg, $arg2) {
        echo __METHOD__, " got $arg and $arg2\n";
    }
}

call_user_func_array("foobar", ["one", "two"]); // 等价 foobar("one", "two")

$foo = new foo;
call_user_func_array([$foo, "bar"], ["three", "four"]); // 等价 $foo->bar("three","four")
namespace Foobar;

class Foo {
    static public function test($name) {
        print "Hello {$name}!\n";
    }
}

call_user_func_array( __NAMESPACE__ .'\Foo::test', ['Hannes']);
call_user_func_array( [__NAMESPACE__ .'\Foo', 'test'], ['Philip']);