https://www.cnblogs.com/lxwphp/p/9867840.html
1.函数分类:
定义:完成某些功能的代码段
系统函数:字符串,数组,数字,日期时间
自定义函数:按照具体需求封装的函数
2.函数的执行原理:
函数不调用不执行,当封装完函数之后将其载入到内存,当调用函数的时候,找到对应的函数,执行函数体;
当碰到return或执行到函数的末尾,再将控制权移交到调用的函数的位置上,接着程序继续执行。
3.注意:
函数名称不能包含特殊字符,以字母或者下滑开头,后面跟上数字,字母,下划线。
函数名称最好以动词开头,最好含义明确,getExt(),uploadFile()
函数名称遵循驼峰法或者下划线。
函数名称不区分大小写,但是尽量遵循定义时的大小写进行调用。
函数名称不支持重名,如果重名会报致命性错误。
函数可以参数,也可以没有参数;
函数可以返回值,也可以没有返回值,return 返回值;
4.函数的返回值:
函数可以有0个或1个返回值,如果想返回多个值,可以通过返回数组或者对象形式实现。
函数通过return加返回值,函数碰到return立即结束。
函数的返回值可以是任意类型。函数默认返回null。
5.函数的参数
通过参数列表可以传递信息到函数,即以逗号作为分割符的表达式列表,参数是从左向右求值得;
函数可以带有0个或多个参数。
参数的数据类型可以为任意数据类型;
参数可以分为可选参数和必选参数,如果有可选参数和必选参数,必选参数一定在可选参数之前;
6.局部变量:
函数体内声明的变量为局部变量;
局部变量分为动态变量和静态变量;
函数执行完毕立即释放。
6.1动态变量:函数体内的变量,函数执行完毕,就释放。
7.静态变量:通过static关键字声明的变量为静态变量,当第一次调用函数的时候相当于初始化静态变量,当函数执行完毕之后静态变量并没有释放而是保存在静态内存中,当再次调用函数的时候首先从静态内存中取出变量的值再执行。
<?php
function test1(){
$i=1;
echo $i++,"\n";
}
test1();
test1();
test1();
var_dump($i);
输出:1 1 1
<?php
function test1(){
static $i=1;
echo $i++,"\n";
}
test1();
test1();
test1();
var_dump($i);
输出:1 2 3 ,var_dump($i) 时,$i 是报错未定义的变量,$i是局部变量。
8.全局变量:
函数体外声明的变量,或者在函数体内通过global关键字声明的变量。
9.如何在函数体内使用全局变量
a:通过global关键字
b:通过$GLOBALS超全局变量,$GLOBALS包括$_GET,$_POST,$_ENV,$_SERVER
$a=1;
$b=2;
function test2(){
global $a,$b;
var_dump($a,$b);
$a=3;
$b=4;
}
test2();//int(1) int(2)
var_dump($a,$b);//int(3) int(4) 修改的是全局变量$a,$b
function test3(){
global $m,$n;
$m=3;
$n=6;
}
test3();// 如果不调用test3(),下面的$m,$n报错未定义
var_dump($m,$n);//int(3) int(6)
10.可变函数
在PHP中,如果将“函数名称”赋予字符串类型的变量,但是在使用该变量时,如果带有小括号,那么PHP引擎将解析函数。
注意:可变函数不能用于像,echo,print,unset(),isset(),empty(),include(),require(),以及类似的语言结构。
$funcname="md5";
echo $funcname('lxw'),"\n";
echo "<br>";
echo md5('lxw');
echo "<pre>";
print_r(get_defined_functions());//得到定义的函数
print_r(get_defined_constants());//得到定义的常量
print_r(get_defined_vars());//得到定义的变量
echo "</pre>";
11.回调函数
定义:就是调用函数的时候将另外的一个函数的名称当作参数传递进去,并且在函数体中进行调用。
如何调用回调函数:
可以通过可变函数的形式在函数体中进行调用,
可以通过call_user_func()和call_user_func_array()进行调用。
扩展:range($start,$end):建立包含指定范围的单元的数组
<?php
var_dump(range(0,10));
输出:array(11) { [0]=> int(0) [1]=> int(1) [2]=> int(2) [3]=> int(3) [4]=> int(4) [5]=> int(5) [6]=> int(6) [7]=> int(7) [8]=> int(8) [9]=> int(9) [10]=> int(10) }
12.array_map()与array_walk()区别
array_map(callbakc,$array1):
callback:回调函数,
$array1:数组,遍历运行callbak函数。
返回数组,包含callback函数处理之后array1的所有元素;
var_dump(array_map('md5',array('lxw','11')));
输出:array(2) { [0]=> string(32) "275939945caa6f44d32a2bdb9687ca47" [1]=> string(32) "6512bd43d9caa6e02c990b0a82652dca" }
使用匿名函数:
<?php
$func = function($value) {
return $value * 2;
};
print_r(array_map($func, range(1, 5)));
?>
//range(1, 5) 输出array(1,2,3,4,5)
输出:Array
(
[0] => 2
[1] => 4
[2] => 6
[3] => 8
[4] => 10
)
$arr=array(1,2,3,4);
function test1($var){
return $var*=2;
}
$res=array_map('test1',$arr);
print_r($arr);
print_r($res);
function test2(&$var,$key,$p){
return $var=$p.":".$var*3;
}
var_dump(array_walk($arr,"test2",'this is'));
print_r($arr);
总结:array_map(callback,$arr):callback回调函数,$arr 运行的数组, 把数组中的每个值发送到用户自定义函数,返回新的值。
函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。
回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
array_walk($arr,myfunction,$p): 函数对数组中的每个元素应用用户自定义函数。在函数中,数组的键名和键值是参数。 您可以通过把用户自定义函数中的第一个参数指定为引用:&$value,来改变数组元素的值, 函数对数组中的每个元素应用回调函数。如果成功则返回 TRUE,否则返回 FALSE。 典型情况下 myfunction 接受两个参数。array 参数的值作为第一个,键名作为第二个。如果提供了可选参数 userdata ,将被作为第三个参数传递给回调函数。
将函数名赋值为 null 时:
$a1=array("Dog","Cat");
$a2=array("Puppy","Kitten");
print_r(array_map(null,$a1,$a2));
输出:合并后的索引二维数组
Array
(
[0] => Array
(
[0] => Dog
[1] => Puppy
)
[1] => Array
(
[0] => Cat
[1] => Kitten
)
)
array_filter() 函数用回调函数过滤数组中的值。 该函数把输入数组中的每个键值传给回调函数。如果回调函数返回 true,则把输入数组中的当前键值返回结果数组中。数组键名保持不变。
$arr2=array(1,2,3,4,5,6,7);
function odd($var){
if($var%2==1){
return $var;
}
}
print_r(array_filter($arr2,"odd"));
输出:Array ( [0] => 1 [2] => 3 [4] => 5 [6] => 7 )
call_user_func(myfunc,$param);
echo call_user_func("md5",'lxw');//32位加密字符
call_user_func_array(myfunc,array);
function add($x,$y){
return $x+$y;
}
function reduce($x,$y){
return $x-$y;
}
echo "
";
echo call_user_func_array("add",array(1,2));//3
echo call_user_func_array("reduce",array(3,5));//-2
13.匿名函数也叫闭包函数,允许创建一个没有指定名称的函数,最经常用作回调函数参数的值。匿名函数也可以作为变量的值来使用。
$func=function ($params){
return "this is test ".$params;
};
echo $func("PHP");
输出:this is test PHP
$func2=create_function('$x,$y','return $x+$y;');
echo $func2(2,3);//5
$func1=create_function('$name','echo "hello world $name";');
echo $func1('lxw');
输出:hello world lxw
$arr1=array(1,3,4);
print_r(array_map(function ($var){return $var*2;},$arr1));
输出:Array ( [0] => 2 [1] => 6 [2] => 8 )
14.递归函数 能少用就少用
通俗讲就是自己调用自己的函数,通过特定条件结束执行。
场景:PHP实现目录的遍历,目录的复制,删除非空目录操作;
无极限分类也可以通过递归调用实现。
test3(3);
输出:3 2 1 0