18)PHP,可变函数,匿名函数 变量的作用域
(1)可变函数:
可变函数,就是函数名“可变”——其实跟可变变量一样的道理。
$str1 = “f1”; //只是一个字符串,内容为”f1”
$v1 = $str1(3, 4); //形式上看起来是一个变量后面加上括号,则其本质是该变量的“内容”(f1)后面加括号,即这里是调用函数f1(3, 4);
(2)匿名函数
匿名函数就是没有名字的函数,其有两种表现形式:
表现1:
$f1 = function(){。。。函数体;};
//这里的匿名函数定义形式上没有名字,但其实又将之赋值给了变量$f1
使用时,就跟“可变函数”一样了:$v1 = $f1();
表现形式2:
调用其他函数2(匿名函数,实参1,实参2, ...... );
说明:
1此形式的匿名函数只有定义的函数体(无函数名)
2此形式的匿名函数只能作为其他函数调用时的参数(其他函数通常有特定用处)
3此匿名函数会在调用其他函数的“过程中”被执行。
能够使用(匿名)函数当作实参的函数,并不多!
其中有一个常见的是:call_user_func_array();
其使用形式为:
call_user_func_array(匿名函数,数组);
含义:
将数组的每一项当作该匿名函数的若干个实参,传递到该匿名函数中,并执行该匿名函数,并可以从该匿名函数中返回数据。
(3)变量的作用域
通常说作用域,有2个:
局部作用域:只能在所定义的函数范围内使用。
全局作用域:在函数的“外部”范围使用。
——php中,局部和全局作用域是不重叠的
——js中,全局作用域是包括局部作用域的
但还有两个:
超全局:就是在函数的内部和外部都可以使用。
超全局变量只有系统内部预定义的那几个,我们不能再程序中创建超全局变量。
静态局部作用域:其实也是局部,但多一个特征:数据能够在函数退出后仍然保持不丢失。
(5)局部访问全局变量
1,在局部范围内,使用global关键字对全局变量进行一次“声明”,则就可以使用了:
语法:global $变量名;
说明:
1,实际上,函数中的global 语句,其实是创建了一个跟外部变量同名的局部变量,并通过“引用”的方式指向了外部变量的数据区
2,在函数中(局部范围),使用$GLOBALS超全局数组来引用(使用)全局变量:
$GLOBALS超全局数组的作用是用于存储所有全局变量的数据:变量名为下标,变量值为对应元素值。
但通过 $GLOBALS操作全局变量,是直接操作(而不是引用操作),即如果unset该对应元素,则全局变量对应变量也被unset:
3,实际上,我们还可以在函数内部直接使用$GLOBALS数组,添加元素的方式来创建全局变量,自然也就类似局部使用全局: