函数
php的函数类比c语言的函数,扩充了许多种类的函数,我们将一一讨论,下面是这节将会讲到的函数
- 普通函数
- 默认值函数
- 参数变化函数
- 可变函数(不是参数变化)
- 回调函数
- 匿名函数
- 闭包
普通函数
普通函数就是与大多数编程语言一样格式的函数,我们分为有参数,无参数,有返回值,无返回值四类。
- 无参函数
格式:
function 名称()
{
...
}
function f1()
{
echo "i am is a function";
}
f1();//i am is a function
- 有参函数
function 名称(参数1,参数2...参数n)
{
...
}
function f1($num1,$num2)
{
echo $num1+$num2;
}
f1(10,20);//30
- 无返回值函数
function 名称()
{
...
}
function f1()
{
echo "i am is a function";
}
f1();//i am is a function
- 有返回值函数
function 名称($num1,$num2,...参数n)
{
...
return 变量/值
}
function f1($num1,$num2)//形参num1 num2
{
return $num1+$num2;
}
echo f1(10,20);//30,实参10,20
此处我们再讨论下php函数参数传递的两种格式,一个是值传递,一个是引用传递。
格式:
//值传递
function f1($num)
{
}
//引用传递
function f1(&$num)
{
}
本质剖析:
和C语言一样,值传递仅仅是把变量的值传递给函数的形参,形参无论如何操作都不会改变形参,而引用参数传递就是用到前面一节讲的引用的本质就是变量本身,内存共用。所以引用传递的变量,在函数体内被改变,外面的参数值也会改变。
//值传递
function f4($num)
{
$num += 10;
return $num;
}
$num = 10;
echo $num;//10
f4($num);
echo $num;//10;
//引用传递
function f5(&$num)
{
$num += 10;
return $num;
}
$num = 10;
echo $num;//10
f5($num);
echo $num;//20;
默认值函数
php的默认值函数和C++的也是一样的,规则也大致一样。一般都是用于函数的形参个数大于等于实参个数
注意点:函数参数的默认值只能出现在最靠右的(不只是指最后一个,可以是连续的倒数几个参数),否则会出现未知错误。当参数存在默认值时,没有实际参数时,会取形参默认值,存在实际参数时,会取实参传递给形参的值。
//函数参数默认值
function f1($num1,$num2=10)
{
return $num1+$num2;
}
echo f1(10);//20,参数2是默认值
echo f1(10,20);//30
参数变化函数
正常情况下,我们认为函数的形参个数和实参个数必须是相等的,不然如何调用,但是php的参数是可以不对等的,实参个数可以大于形参个数,可以小于形参个数,当然也可以等于形参个数。我们直接说实参个数大于形参个数和实参个数小于形参个数的情况。
实参个数小于形参个数:通常就是函数参数带默认值的情况。
//函数参数默认值
function f1($num1,$num2=10)
{
return $num1+$num2;
}
echo f1(10);//20,参数2是默认值
echo f1(10,20);//30
实参个数大于形参个数:func_get_args()保存函数所有的传递过来的实参。
function f3()
{
$sum = 0;
echo func_get_args();//1,2,3
foreach (func_get_args() as $value)
{
$sum += $value;
}
echo $sum;//6
}
php5之后的版本可以用新语法...$变量存放当前未被接受的实参
//格式
function f($num1,...$num2)
{
//...$num2其实就是个数组,保存数字2,3,4,5
}
f(1,2,3,4,5);
//求和,$num3数组保存剩余未匹配的参数
function func($num1,$num2,...$num3)
{
$sum = 0;
$sum += $num1;
$sum += $num2;
foreach($num3 as value)
{
sum += value;
}
echo sum;
}
func(1,2);//3,$num3数组是空
func(1,2,3)//6,$num3数组存放3
func(1,2,3,4)//6,$num3数组存放3和4
可变函数
可变函数是php特有的一种函数,它是用变量的值对应函数的名称去简介的调用函数。
可变函数的调用有两类,一类是给变量赋不同的值,按照值不同调用不同的函数,还有一类是给变量赋不同的值,用call_user_func_array(变量名,接受函数参数的数组)去调用不同的函数
格式1示例:
//函数f1
function f1()
{
echo "f1";
}
//函数f2
function f2($num)
{
echo $num;
}
//函数f3
function f3($num)
{
return $num+10;
}
$num = "f1";
$num();//f1;
$num = "f2";
$num(10);//10;
$num = "f3";
echo $num(10);//20;
格式2示例
//函数f1
function f1()
{
echo "f1";
}
//函数f2
function f2($num)
{
echo $num;
}
$num = "f1";
call_user_func_array($num,array());//f1
$num = "f2";
call_user_func_array($num,array(10));//10
回调函数
回调函数就是利用当前函数的参数作为内部调用函数的参数,执行内部函数的过程,通常回调函数就是利用可变函数去完成的。
我们可以这样理解回调函数,假设当前函数是主线程,在执行当前函数时,突然去调用另一个子线程函数,当子线程执行完后,继续往下执行主线程。回调函数的调用也有两种,一类是正常调用,第二类是用call_user_func_array()调用,call_user_func_array()其实就是前面的可变函数的调用
无参数回调:
function f1()
{
echo "f1";
}
function f2()
{
echo "bbb";
f1();
echo "ccc";
}
f2();//bbbf1ccc
有参数回调
function f1($num)
{
echo $num;
}
function f2($num)
{
echo "bbb";
f1($num);
echo "ccc";
}
f2(10);//bbb10ccc
用回调函数模拟加减乘除,用户只需调用一个函数
//+
function add($num1=0,$num2=0)
{
echo $num1+$num2;
}
//-
function del($num1=0,$num2=0)
{
echo $num1-$num2;
}
//*
function div($num1=0,$num2=0)
{
echo $num1*$num2;
}
///
function mul($num1=0,$num2=0)
{
echo $num1/$num2;
}
//用回调函数智能选择函数
function callback($choice,$num1,$num2)
{
$num = $choice;
//$num($num1,$num2);可变函数格式1
return call_user_func_array($num,array($num1,$num2));//可变函数格式2
}
callback("add",10,20);//30
callback("del",10,20);//-10
callback("div",10,20);//200
callback("mul",20,20);//1
匿名函数
匿名函数和JavaScript的匿名函数一样,匿名的函数并不是没有名字,简介的将名称给了变量而已。
//匿名函数格式
$num = function ($num)
{
...
};
$num = function()
{
echo "ni ming";
};
$num();//niming
闭包函数
闭包就是函数内部有一个匿名函数,且这个函数内部定义的变量和当前函数的参数,匿名函数不可以直接用,只可以通过use(参数1,参数2)传递使用
function f()
{
$num = function()
{
echo "i am ni";
};
$num();
}
f();//i am ni
function fun($num)
{
$num = function() use($num)
{
echo $num;//不能直接用,必须通过use()传递进去
};
$num();
}
fun(10);//10
如何调用其它php文件的全局变量/函数/类
格式:
- include "php地址"
- include_once "php地址"
- require "php地址"
- require_once "php地址"
其实总的就两类,include和require,其中后缀加once就是保证不会重复引入php文件。require适合静态引用,在头部引用。而inlude适合动态引用,在程序运行过程中引用。
//test1.php