php基础之函数入门

时间:2022-03-28 20:24:11

函数基础

函数的定义

规范:
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
  • 全局作用域
    不在函数内部的范围,也就是函数的外部
    对应的变量成为全局变量

通常情况下:

  1. 全局范围不能访问局部变量
  2. 局部范围不能访问全局变量
  3. 函数内部的变量在函数执行完成后就销毁掉
  4. 函数内的静态变量在函数执行完后不被销毁

局部范围访问全局变量

  • 方式一:
    示例:
$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函数的基础介绍就到这了~