静态变量:在函数内部定义时变量使用static关键字+变量名修饰,用来实现跨函数共享数据的变量
基本语法:
function 函数名()
{
static $变量名 = 值 //通常在定义的时候就直接赋值
}
静态变量的作用是为了跨函数共享数据(同一个函数被多次调用)
静态变量的原理:系统在进行编译的时候就会对static这一行进行初始化:为静态变量赋值
函数在调用的时候,会自动跳过static关键字这一行
静态变量的使用:
1、为了统计:当前函数被调用的次数
2、为了统筹函数多次调用得到的不同结果(递归思想)
静态变量示例:
<?PHP
function num()
{
static $a = 0;
$a++;
$b = 0;
$b++;
echo "a=".$a."b="."$b"."\n";
}
num(); //编译结果:a=1b=1
num(); // a=2b=1
num(); // a=3b=1
?>
static变量和普通变量的区别:
static全局变量与普通全局变量区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
static 变量的好处:不会被其他文件所访问,修改其他文件中可以使用相同名字的变量,不会发生冲突。
可变函数
PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。
基本语法:
$ 变量名 = "display";
function display(参数)
{
函数体;
}
$变量(参数); //可变函数
可变函数在系统使用的过程中还是比较多的,尤其是使用很多系统函数的时候:需要用户在外部定义一个自定义函数,但是是需要传入到系统函数内部使用
简单递归思想函数调用示例:
<?PHP
function recursive($n) //编译结果:6
{
$func = __FUNCTION__; //获取当前函数的名称
if($n>=1)
{
return $n + $func($n-1); //以后如果修改了函数名,我们就不需要修改函数的方法体了
}
}
echo recursive(3); //可变函数
?>
注意:可变函数不能用于例如 echo,print,unset(),isset(),empty(),include,require 以及类似的语言结构。需要使用自己的包装函数来将这些结构用作可变函数。例如 $a = 'unset'; $a = 'empty';
匿名函数
匿名函数(Anonymous functions),也叫闭包函数(closures),允许指定一个没有名称的函数,把匿名函数赋值给变量,通过变量来调用。最经常用作回调函数(callback)参数的值。匿名函数目前是通过 Closure 类来实现的。
基本语法:
变量名 = function()
{
函数体;
};
闭包函数也可以作为变量的值来使用。PHP 会自动把此种表达式转换成内置类 Closure 的对象实例。把一个 closure 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号:
变量保存匿名函数,本质得到的是一个对象(closure)
匿名函数调用示例:
<?php
$greet = function($name)
{
echo "Hello $name"."\n";
};
$greet('World'); //编译结果:Hello World
$greet('PHP'); // Hello PHP
?>
闭包
闭包:closure,一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)
简单理解:函数内部有一些局部变量(要执行的代码块)在函数执行之后没有被释放,是因为在函数内部还有对应的函数在引用(函数的内部函数:匿名函数)
简单闭包示例:
<?php
function closureFunc()
{
$Func = function()
{
echo "张三";
};
$Func(); //普通函数内部调用了匿名函数
}
closureFunc();//输出: 张三
?>