variable function

变量函数

必须掌握

在介绍回调函数之前,我们先了解一下什么是变量函数。其实很简单,一个把变量当做函数名的函数就是变量函数。它的概念和 可变变量 是一个意思。举个例子:


function wow()
{
	echo "wow";
}

function php()
{
	echo "php";
}

$a = 'wow';
$b = 'php';
echo $a().$b(); // 输出 wowphp
		

看懂了吗?如果一个 变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它,这就是变量函数的定义。

callback function

把函数当做参数

必须掌握

相信会 JavaScript 的小伙伴对回调函数和匿名函数并不陌生,不知道的童鞋也不必觉得这个有多难,其实就是名字起的高大上一点罢了,我对回调函数的总结就是标题上的七个大字:『把函数当做参数』,这个被当做参数的函数就是回调函数。

在 PHP 中许多的内置函数里都会有很多把自定义函数当做参数的系统函数,比如最简单的 call_user_func_array 方法,接受的传参就是一个函数和这个函数所需要的参数。比如这样:


// 计算两个参数之和
function caculate($a, $b)
{
	return $a + $b;
}

echo call_user_func_array('caculate', [1, 3]);
		

上面的例子最终会输出 4。call_user_func_array 有两个参数,第 1 个参数是一个字符串,表示要调用的函数名。这就相当于在它的内部调用了 $func_name = 'caculate'; $func_name() 第 2 个参数是一个数组,表示参数列表,按照顺序依次会传递给要调用的函数。

除此之外,我还可以自己写一个以回调函数作为参数的函数:


function caculate($a, $b, $func_name)
{
	return $a + $func_name($b);
}

// 计算一个数的平方
function getSquare($v)
{
	return $v * $v;
}

echo caculate(1, 2, 'getSquare');
		

上面这个例子将 getSquare() 作为一个参数传入到了 caculate() 函数中,这个函数再调用 getSquare()。这就相当于这个函数的计算规则是这样:$a + $b * $b,所以上面的例子就等于 1 + 2 * 2 = 5.

anonymous function

匿名函数

必须掌握

很简单,匿名函数其实就是没有名字的回调函数,也叫闭包函数。你可以临时创建一个没有指定名称的函数当做调用另一个函数的传参,并将计算结果返回给调用函数。

比如还是上面那个例子,这时候我不想计算 $b 的平方了,而是想计算他们的立方。同时由于计算立方过于简单,我不想再多写代码声明这个计算立方的函数,那么就可以这么写:


function caculate($a, $b, $func_name)
{
	return $a + $func_name($b);
}

echo caculate(1, 2, function($v) {
	return $v * $v * $v; // 或者使用 pow($v, 3)
}); // 输出 9
		

你可以看到,我不再声明那个叫做 getSquare() 的函数了,而是直接传递了一个我自己定义的函数,并且这个函数没有名字。父级函数 caculate() 在使用第三个参数时,会把 $b 作为参数传递到我的匿名函数中,我的匿名函数再返回结果给 caculate() 函数,返回最终的值。这样就相当于 1 + 2 * 2 * 2 = 9

把闭包函数作为变量的值

闭包函数也可以作为变量的值来使用,PHP 会自动把此种表达式转换成内置类 Closure 的对象实例。把一个 closure 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号:


$hello = function($name) {
	return 'hello '.$name;
};

echo $hello('VAGH'); // 输出 hello VAGH
		

那如果我在定义匿名函数的同时,使用自己的参数呢? PHP 也是支持的。闭包可以从父作用域中继承变量。 任何此类变量都应该用 use 语言结构传递进去。像这样:


$message = ' Nice to meet you!';

// 继承 $message
$hello = function ($name) use ($message) {
    return 'hello '.$name.$message;
};
echo $hello('VAGH');
		

以上示例会输出:hello VAGH Nice to meet you!

请登录

WOWPHP 账号登录 GitHub 账号登录

还没有账号?现在去注册一个~