函数作用域与闭包-回调与参数-函数多值返回类型方式
- 实例演示函数作用域与闭包,回调的使用场景与参数调用;
- 实例演示函数的多值返回类型方式,重点是json
1. 实例演示函数作用域与闭包,回调的使用场景与参数调用;
1.1 实例演示函数作用域与闭包
// 实例演示函数作用域与闭包
// 函数内部访问外部变量
$a = 1;
$b = 2;
$c = 3;
// global 访问外部变量
function fa() {
global $a;
return $a;
}
// 显示 1
echo fa(), '<br>';
// 全局变量 $GLOBALS 访问
function foo() {
return $GLOBALS['b'];
}
// 显示 2
echo foo(), '<br>';
// 匿名函数闭包 closure 访问
$par = function() use( $c ) {
return $c;
};
// 显示 3
echo $par(), '<br>';
// 函数内使用 closure 闭包
function par($a, $b) {
$sum = function($sum) use ($a, $b) {
return "$sum = $a + $b = ". ($a + $b);
};
return $sum;
}
// 显示 sum = 1 + 2 = 3
echo par($a, $b)('sum'), '<br>';
echo '<br>';
1.2 回调的使用场景与参数调用
- 回调的使用场景:php单线程同步执行,遇到耗时函数阻塞,可以改为回调函数异步执行
// 函数回调的参数调用
function cb($a, $b, $c) {
return "$a + $b = $c : ". var_export($a + $b === $c, true);
}
// 传入参数列表
// 显示 1 + 2 = 3 : true
echo call_user_func('cb', 1, 2, 3), '<br>';
// 传入数组参数
// 显示 2 + 3 = 4 : false
echo call_user_func_array('cb', [2, 3, 4]), '<br>';
echo '<br>';
// 对象回调的参数调用
class Obj {
// 静态方法
public static function fa($a) {
return "fa: $a";
}
// 公开方法
public function foo($b) {
return "foo: $b";
}
}
// 类的实例化
$obj = new Obj();
// 传入参数列表
// 访问静态方法 fa
// fa: 1
echo call_user_func([$obj, 'fa'], 1), '<br>';
// fa: 2
echo call_user_func(['Obj', 'fa'], 2), '<br>';
// fa: 3
echo call_user_func('Obj::fa', 3), '<br>';
echo '<br>';
// 访问公开方法 foo
// foo: 4
echo call_user_func([$obj, 'foo'], 4), '<br>';
echo '<br>';
// 传入参数数组
// 访问静态方法 fa
// fa: 1
echo call_user_func_array([$obj, 'fa'], [1]), '<br>';
// fa: 2
echo call_user_func_array(['Obj', 'fa'], [2]), '<br>';
// fa: 3
echo call_user_func_array('Obj::fa', [3]), '<br>';
echo '<br>';
// 访问公开方法 foo
// foo: 4
echo call_user_func_array([$obj, 'foo'], [4]), '<br>';
echo '<br>';
2. 实例演示函数的多值返回类型方式,重点是json
// 函数的多值返回
function multi(...$args) {
if (!empty($args)) {
if (!is_string($args[0])) return $args[0];
$type = $args[0];
$prams = array_slice($args, 1);
switch ($type) {
case 'serialize':
return serialize($prams);
case 'json_encode':
return json_encode($prams);
case 'object' :
return (object)$prams;
default:
return $prams;
}
}
return $args;
}
// 返回数组
print_r(multi('array', 1, 2, 3));
echo '<br>';
// 返回对象
print_r(multi('object', 1, 2, 3));
echo '<br>';
// 返回序列化
print_r(multi('serialize', 1, 2, 3));
echo '<br>';
// json_encode
print_r(multi('json_encode', 1, 2, 3));
echo '<br>';