函数基础
函数的定义
规范:
function 函数名($args1,$args2){
// todo
}
1.$args1 $args2都属于函数的形参,作用域为函数体内
2.函数的形参由开发者自定义,但要遵循命名规范
函数的调用
规范:
函数名(实参1,实参2);
示例:
/**
* 计算两个数的和
* @param $a
* @param $b
* @return mixed
*/
function add($a, $b)
{
return $a + $b;
}
// 调用函数
$result = add(4, 1);
// 输出函数执行结果
echo "<br> result = $result";
函数的执行过程
1.将函数调用时的实参数据,传递给函数的形参
2.进入函数内部,顺序执行函数体代码
3.直到函数结束,或者遇到return语句,结束函数的执行
4.返回函数调用位置,继续执行原程序
函数的参数问题
参数默认值
在定义函数时,可以给指定的形参定义默认值,这样,在调用该函数时,可以不传此值。
如果给参数的形参定义默认值的话,该形参应在放在没有默认值的形参之后,函数调用传值顺序是一对一的。
示例:
function test($a, $b = 3, $c = 'abc')
{
echo "<br> a = $a b = $b c = $c";
}
test(1, 2, 'a');
test(3, 6);
test(5);
结果为:
a = 1 b = 2 c = a
a = 3 b = 6 c = abc
a = 5 b = 3 c = abc
形参的传值
形参的传值,其实就是变量之间的传值
传值方式有两种,一个是值传递,一个是引用传递
- 值传递
示例:
function demo1($a, $b)
{
$a = $a * $a;
$b = $b * $b;
return $a + $b;
}
$a = 2;
$b = 3;
echo "<br> before call demo1 a = $a b = $b";
demo1($a, $b);
echo "<br> before call demo1 a = $a b = $b";
结果:
before call demo1 a = 2 b = 3
before call demo1 a = 2 b = 3
- 引用传递
示例:
function demo2($a, &$b)
{
$a = $a * $a;
$b = $b * $b;
return $a + $b;
}
$a = 2;
$b = 3;
echo "<br> before call demo2 a = $a b = $b";
demo2($a, $b);
echo "<br> before call demo2 a = $a b = $b";
结果为:
before call demo2 a = 2 b = 3
before call demo2 a = 2 b = 9
可以发现,b的值已经发生变化,可以认为类似于C中的传的变量地址,方法修改的话,直接修改的变量地址所表示的值。
此时,只能传定义的变量,而不能直接传值进去,否则就会报错。
函数参数的数量
当声明一个函数,但是未定义形参,但是在调用的时候,往里面传递了参数,这种情况下,也是可以获取到调用者传递的参数信息,类似于系统提供的var_dump()函数。
示例:
function getArgs()
{
echo "<br> 参数数组为: ";
$arr = func_get_args();
foreach ($arr as $value) {
echo $value . "\t";
}
echo "<br> 参数个数为: " . func_num_args();
echo "<br> 第一个参数为: " . func_get_arg(0);
}
getArgs(1, 2, 3);
结果为:
参数数组为: 1 2 3
参数个数为: 3
第一个参数为: 1
函数的其它形式
可变函数
首先,来回顾一下可变变量。
示例:
/**
* 可变变量
* 一个变量的值是另外一个变量的变量名
*/
$a = 'abc';
$abc = 123;
echo "<br> result is : " . $$a;
结果:
result is : 123
好,再来看一下可变函数,都在代码里了,上
/**
* 可变函数
* 一个函数的函数名是另外一个变量的值,当调用另外一个变量的时候加上()就可以调用次函数了
*/
function test2()
{
echo "<br> this is ke bian function";
}
$c = 'test2';
$c();
function jpg()
{
echo "<br> this is jpg function";
}
function png()
{
echo "<br> this is jpg function";
}
function gif()
{
echo "<br> this is jpg function";
}
$fileName = 'abc.png';
//strrchr 获取指定字符串指定字符最后一次坐标出现后面的字符串
$suf = strrchr($fileName, '.');
//截取字符串
$realSuf = substr($suf, 1);
$realSuf();
结果:
this is ke bian function
this is jpg function
匿名函数
顾名思义,没有名称的函数。有两种表现形式,如下所示。
- 将一个没有名字的函数赋值给一个变量,此时改变量就代表该匿名函数了
示例:
$a = function () {
echo "<br> 这是匿名函数的第一种表现形式";
};
// 调用
$a();
结果:
这是匿名函数的第一种表现形式
- 讲匿名函数当实参使用,比如调用一个函数的时候,将匿名函数作为参数传递到目标函数中
示例:
function f1($a, $b, $c)
{
echo "<br> 这是匿名函数的第二种表现形式。结果为:" . $c($a, $b);
}
f1(2, 3, function ($m, $n) {
return $m + $n;
});
结果:
这是匿名函数的第二种表现形式。结果为:5
函数的作用域
作用域分类
作用域指一个变量可以使用的范围,php中有三种左右域。
- 局部作用域
指一个函数内部的范围,定义的变量只能在该函数内部使用
这样的变量称之为局部变量 - 超全局作用域
指整个项目工程的范围
对应的变量称之为超全局变量
只有系统预设的几个,如:$_GET $_POST $_REQUEST $_SERVER $_COOKIE $_SESSION $_FILES $GLOBALS - 全局作用域
不在函数内部的范围,也就是函数的外部
对应的变量成为全局变量
通常情况下:
- 全局范围不能访问局部变量
- 局部范围不能访问全局变量
- 函数内部的变量在函数执行完成后就销毁掉
- 函数内的静态变量在函数执行完后不被销毁
局部范围访问全局变量
- 方式一:
示例:
$v = 10;
function test()
{
// 使用global声明一个要使用的全局变量的同名局部变量
global $v;// 此处的$v是局部变量,但是和全局的$v指向同一个数据区域
echo "<br> test v = $v";
$v = 12;
}
echo "<br> befor call test ---> v = $v";
test();
echo "<br> after call test ---> v = $v";
结果:
befor call test ---> v = 10
test v = 10
after call test ---> v = 12
- 方式二:
示例:
$v1 = 18;
function test2()
{
//使用超全局GLOBAL变量,根据变量名取数据
echo "<br> v1 = " . $GLOBALS['v1'];
$GLOBALS['v1'] = 81;
}
echo "<br> befor call test2 ---> v1 = $v1";
test2();
echo "<br> after call test2 ---> v1 = $v1";
结果:
befor call test2 ---> v1 = 18
v1 = 18
after call test2 ---> v1 = 81
欧了,php函数的基础介绍就到这了~