函数是可以在程序中重复使用的语句块,在页面加载时函数不会立即执行,只有在被调用时才会执行。
//无返回值
function (par1,par2,par3...){
code;
}
//有返回值
function (par1,par2,par3...){
return result;
}
在代码执行过程中,如果遇到函数则会进入函数作用域,直到遇到 return 或执行完毕后,回到外层函数名的位置,继续执行后面的代码。
temp.png
参数
形参
1. 形参一定是变量名;
function dosomething($par1,$par2){} // √
function dosomething($par1,par2){} // ×
2. 只在当前函数中有效;
function dosomething($par1){
echo $par1; // √
}
dosomething('11'); // 11
echo $par1; // ×
3. 设置默认参数;
function dosomething($a,$b=2){ //$b=2 为默认参数设置
$result=$a*$b;
return $result;
}
echo dosomething(2,4); //8
$box1=dosomething(199); //398
echo $box1;
▁ 参数默认值不能为对象、资源类型;
▁ 在低版本中,参数不能直接传递变量,需要使用 & 符号;
实参
1. 实参可以是标量、变量;
2. 实参跟形参应一一对应;
参数数量
1. 实参多于形参时不会报错(多数语言会报错);
2. 实参少于形参,并且没有或默认参数不够的情况下会报错;
3. 实参少于形参,但是默认参数可以对应的情况下不会报错;
未定参数
◇ func_get_agrs():获取函数内所有的实参,返回一个数组;
◇ func_get_agr(n):获取第 n 个参数,n 的起始下标 0;
◇ func_num_agrs():获取所有实参的长度;
function sum(){
$result=0;
foreach(func_get_args() as $i){
$result+=$i;
}
echo func_num_args()." , ";
return $result;
}
echo sum(1,23,4,32,4,2); //6, 66
echo '
';
echo sum(1,2); //2, 3
echo '
';
echo sum(123,1); //2, 124
特殊函数
可变函数:如果一个变量名后面有括号,PHP 将寻找与该变量值同名的函数,并且尝试执。"可变函数" 还可以用来实现包括回调函数、函数表在内的一些用途。
function func1($a,$b){
return $a*$b;
}
$fc="func1";
echo $fc(2,4);
匿名函数:匿名函数也叫闭包函数,允许临时创建一个没有指定名称的函数。
最经常用作回调函数 callback 参数的值。
◇ 赋值形式:
$greet=function($name){
printf("Hello %s",$name);
};
$greet('World'); //hello world
$greet('PHP'); //hello PHP
◇ 参数形式:
$arrs=[1,2,3,1,5,1,51,121];
$fn=call_user_func_array(function(){
$a=func_get_args();
$sum=0;
foreach ($a as $i){
$sum+=$i;
}
return $sum;
},$arrs);
echo $fn; //185
printf() 函数、及其他相关函数可 参考。
作用域
局部作用域
全局作用域
超全局作用域
静态局部作用域
作用域中的变量
/* 各自独立 */
$overall=100;
function dosomething(){
$locals=998;
echo $overall; //Undefined
}
dosomething();
echo $locals; //Undefined
————————————————————————————————————————
/* 互不影响 */
$thisOne=100;
function dosomething(){
$thisOne=1;
echo $thisOne; //1
}
dosomething();
echo $thisOne; //100
访问全局变量
使用 global 关键字:
$thisOne=100;
function dosomething(){
global $thisOne;
$thisOne++;
echo $thisOne; //100
}
dosomething();
echo $thisOne //101
使用 $GLOBALS 全局数组:
$thisOne=100;
function dosomething(){
echo $GLOBALS['thisOne']; //100
$GLOBALS['thisOne']++;
echo "
".$GLOBALS['thisOne']; //101
}
dosomething();
echo "
$thisOne"; //101
◇ 通过 $GLOBALS 数组创建全局变量:
$thisOne=100;
function dosomething(){
echo $GLOBALS['thisOne'];
$GLOBALS['thisTwo']=200;
echo $thisTwo; //Undefined 不能直接访问
echo $GLOBALS['thisTwo']; //在局部中只能通过数组键名访问
}
dosomething();
echo "
$thisTwo"; //200 成功
◇ 通过 global 创建全局变量:
function dosomething(){
global $some;
$some=9;
echo $some; //9
}
dosomething();
echo $some; //9
检测函数是否被定义: function_exists()
function testfunc(){
echo '已定义';
}
if(function_exists('testfunc')){ //true
testfunc();
}
函数的编程思想
递归思想
要解决一个复杂的问题,根据现实逻辑,可以通过多个子类问题的答案解决,而这些子类问题又可以通过多个小问题解决,以此类推...一直到最小的问题,通常都会是一个已知的数据。
function demo(){
static $i=1;
echo "$i,";
$i++;
if($i<10){
demo(); //简单讲:递归就是在调用自己
}
}
demo(); //1,2,3,4,5,6,7,8,9,
f.png
阶乘案例
//求未知数的阶乘
function factorial($n){
if($n==1){
return 1;
}
$result=factorial($n-1)*$n;
return $result;
}
echo factorial(3); //6
递推思想(迭代思想)
要解决一个复杂的问题,如果能得知最小问题的答案(通常是已知),根据算法得出上级问题的答案,以此类推一直推算到可以解决复杂问题。
递推图例
temp.png
斐波那契数列
function fibonacci($n){
$n1=1; //数列的第一个初始数,代表求值的上两个数
$n2=1; //数列的第一个初始数,代表求值的上一个数
$result=0;
for($i=3;$i<=$n;$i++){
$result=$n1+$n2;
$n1=$n2; //数据轮换
$n2=$result; //数据轮换
}
return $result;
}
echo fibonacci(3); //第3项的结果为:2
echo fibonacci(4); //第4项的结果为:3
echo fibonacci(5); //第5项的结果为:5
echo fibonacci(6); //第6项的结果为:8
▁ 递归推算规则:从大到小,再回归到大;
▁ 递推推算规则:从小到大;
▁ 在两种方法都能解决问题时,优先使用递推解决;