PHP函数

58 阅读2分钟

函数

函数使用关键字function进行定义

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

函数由参数、返回值、函数工作代码构成,非常简单

参数

形参、实参:和大多数语言一样,定义的参数被称为形参,调用函数实际传入的被称为实参

function demo($name, $age){ // 这里的是形参
    echo $name . ":" . $age
}
demo('张三', 16) // 这里的是实参

参数类型声明,可以在参数位置定义期望的传参数类型,如果不匹配则会出现Fatal error(php5)、TypeError exception(php7)

class C{};

function demo(C $c){
    echo var_dump($c);
}

demo(new C)

默认情况下,当传递的参数不是函数指定的参数类型时,php将会尝试将其转换为指定的类型,比如字符串与数字之间的转换,php版本的不同可以支持的参数类型指定不同

匿名函数

匿名函数在声明时会省略函数名,其余和普通函数相同,类似Python,可以在很多内置函数使用时,直接在参数位置定义匿名函数更快捷的进行方法调用

function (args){
    code;
    return ;
}

比如使用array_map对数组元素进行批量加工

$a = [1, 2, 3, 4];
$result = array_map(function ($var) {
    return $var * $var;
}, $a);
var_dump($result);
array(4) { [0]=> int(1) [1]=> int(4) [2]=> int(9) [3]=> int(16) }

闭包函数

在PHP中闭包与匿名函数是一个概念

使用 use 关键字,闭包函数可以实现从父级作用域中继承变量

$name = 'world';
$sayHello = function () use ($name) {
    echo("Hello $name");
};
$sayHello();

单纯使用use可以让闭包函数使用上层作用域下的变量,但无法引用修改,如希望修改,需要在变量use时候使用&

$name = 'old';
$sayHello = function () use (&$name) {
    $name = 'new';
};
$sayHello();
echo $name; // 输出 new

变量函数

可以将可调用方法作为字符串变量,当字符串变量后携带有括号时,php将会寻找同名函数并执行

比如

function test(){
    echo "nice";
}
$func = 'test';
$func() // 当字符串变量加了()

但是不能直接使用用于例如echoprintunset()isset()empty()includerequire以及类似的语言结构

回调函数

php中通过字符串函数名,可以很方便的实现回调函数

function func(){
    echo "func";
}
function test($funcname){
    $funcname();
}
test("func")

PHP还提供了两个内置函数call_user_func()call_user_func_array()来对回调函数进行支持

call_user_func($callback [, $parameter, ... ])

第一个参数$callback是被调用的回调函数,其余参数是回调函数的参数,多个参数之间使用,分隔

function func($funcname, $a, $b){
    return call_user_func($funcname, $a, $b);
}
function add($a, $b){
    echo $a + $b;
}
func('add', 1, 1)

call_user_func_array($callback ,$param_arr)
function func($funcname, $a, $b){
    return call_user_func_array($funcname, array($a, $b));
}
function add($a, $b){
    echo $a + $b;
}
func('add', 1, 1)

递归函数

函数内部调用函数本身,则为递归


在 PHP 中最大递归层数也不是没有限制的,这与程序的内存限额有关

PHP5 默认允许一个程序使用 128M 的内存,PHP7 默认允许使用 256M 的内存

当递归层数过大导致 128M 内存耗尽时,程序就会产生一个致命错误并退出


实现递归的灵魂是确定递归的终止条件,比如求1-10的和,递归方式,那么终止条件为达到10

$i = 0;
function get_sum($i)
{
    if ($i == 11) return 0; // 到达递归终点,不加了 终止递归
    return $i + get_sum($i + 1);
}

print get_sum($i); // 55

递归实现斐波那契数列

function demo($num){
    if($num == 1 || $num == 2){
        return 1;
    }else{
        return demo($num - 1) + demo($num - 2);
    }
}
echo '数列第 10 位是:'.demo(10);