一、函数的参数与返回值

1、函数的参数:

  1. 定义一个命名函数或者匿名函数的时候,所设置的参数为形参,当调取这个函数进行执行的时候,所传的参数为实参。

  2. 多个参数可以用,隔开。

  3. 如果函数定义的时候设置了形参,那么调用这个函数的时候就必须传实参,如果没有设置形参,调用的时候可以不传实参。

  4. 如果没有参数函数的执行任务是固定的

1628390254(1).jpg

1628391232(1).jpg

那么有小伙伴可能会问,我定义了一个函数,设置了形参,这个形参需要前端传给我,但是前端比较傲娇有时候不给可咋办,或者产品经理安排一个任务让做一个表格,就是给了个大面儿的需求让先出个给她看看后面再无限期修改又咋办,首先不(zou)要(ta)生(yi)气(dun),这个时候我们可以封装一个函数,然后给函数的形参赋一个初始值,这样调用函数的时候就算不传值也可以直接运行,但是需要注意:

  1. 调用函数所传的参数一定是从左到右读的

  2. 只能说是前面有参数后面空着如传(8,9),也就是不传参数或少传参数,后面的都会使用默认值,传了参数就会发生覆盖,但是不能前面空着后面有参数("他","hotpink"),这个就是错误的。

  3. 那么有的用户就是想只传过几个参数来,其他的默认咋整?(我觉得可以用IF语句做判断来进行调整,比如判定空或者输入的内容错误就输出默认值或者报错,否则就正常使用输入的信息)。

  4. 实例

    <?php//建立一个创建表格的函数为例,设置4个形参行rows、列cols、表格内字符$content、表格颜色样式$bgColor,并分别给定类型、赋初始值functioncreateTable1(int$rows=7,int$cols=8,string$content='打',string$bgColor='red'):string{//创建一个表格的table标签$table="<tableborder='1cellspacing='0bgColor='$bgColor'>";//循环遍历给表格添加行的内容for($i=0;$i<$rows;$i++){$table.="<tr>";//循环遍历给表格添加列的内容for($j=0;$j<$cols;$j++){$table.="<td>$content</td>";};//用.拼接运算符进行拼接$table.="<tr/>";};$table.='</table>';return$table;}echocreateTable1();?>

    运行实例 »

    点击 "运行实例" 按钮查看在线实例

  5. 可以用function_exists();判断是否有次函数。

  6. 剩余参数"..." 适用于参数的个数不确定的情况,一般用在数据库的链接,下面先举个简单的例子:

<?php//定义一个函数,参数个数不确定functiontest(...$args){//返回数组内所有数的和returnarray_sum($args);}//输出函数echotest(123,12415,1221341,111,24,1,5);?>

1628398775(1).jpg

2、函数的返回值

在定义的函数中,可以用return语句返回一个值,这里需要注意

1.函数只能返回单个值,函数遇到return就会停止执行后面的代码,遇到return即结束。

2.函数的返回值,也可以返回数组、对象、或者是一个函数,其中如果返回值是函数也是不能用echo来输出的。

<?php//定义一个函数demo()functiondemo(){//设置多个returnreturn'66';return'admin';returntrue;}//因为不确定最终能输出什么内容,这里我们用var_dump来输出函数var_dump(demo());?>

从结果中可以看到函数输出了66就停止了后面没再往下执行

1628396376(1).jpg

如果想输出多个值,可以以数组、对象的形式返回:

<?php//多个值以数组的形式返回//定义一个函数demo()functiondemo(){//返回一个数组return['status'=>1,'msg'=>'登录成功'];}//输出demo()print_r(demo());//多个值以对象的形式返回//定义一个函数demo2()functiondemo2(){//返回一个类实例(对象)returnnewclass(){public$name='admin';public$gender='女';};}//将函数赋值给$obj$obj=demo2();//输出$objvar_dump($obj);//获取对象里的nameecho$obj->name;?>

二、匿名函数及变量、匿名函数的作用域

之前在php变量的类型与转换及变量与常量的区别说到过php全局成员:常量、函数、类、接口,其实严格点来说,应该是:常量、命名函数、类、接口。

匿名函数,匿名函数说白一点就是不带名字的函数,像如命名函数都是带名称,可以使用名称直接调用的如:

<?php//定义一个名叫divide的命名函数functiondivide($one,$two){//返回两个参数的商return$one/$two;}//用名称就能输出这个函数echodivide(99,9);?>

匿名函数就是不带名称的,这个时候需要赋给一个变量:

<?php//声明一个匿名函数复制给变量$divide$divide=function($one,$two){//返回两个参数的商return$one/$two;};//需要用变量来输出这个匿名函数echo$divide(99,9);?>

匿名函数跟函数体内声明的变量都是严格受到作用域的限制的,如:

匿名函数:

<?php//echo$closure('admin2');由于作用域的严格限制,匿名函数的输出只能放在函数的下方,放在上面会报错//定义一个匿名函数并赋值给$closure$closure=function($name){//返回内容,其中双引号里面是可以加变量的(用{}隔开)return"欢迎{$name}<br>";};//输出函数的内容echo$closure('admin2');?>
函数体内声明的变量:

实例

<?php//定义一个函数functioninfo(){//声明变量$uname='admin';//函数内输出变量echo$uname;}//调用函数info();//函数外尝试调用局部变量echo$uname;?>

运行实例 »

点击 "运行实例" 按钮查看在线实例

可以看到函数能正常输出,函数外调用变量失败,函数内的变量严格受作用域限制,无法在外部使用

1628401441(1).jpg

但是函数体外定义的全局变量就能随便调用嘛?

可以做一个尝试,把上面的代码改一下:

实例

<?php//声明一个全局变量$uname='admin';//定义一个函数functioninfo(){//函数内输出全局变量echo$uname;}//调用函数info();?>

运行实例 »

点击 "运行实例" 按钮查看在线实例

哦吼。。。跟上面报了一样的错误:

1628401765(1).jpg

那全局变量都调取不了嘛?其实不是的,全局变量在函数内调用可以用global超全局变量跟$GLOBALS超全局数组引入:

实例

<?php//声明两个全局变量$uname='admin';$pwd=md5('123456');//定义一个函数functioninfo(){//用global引入$uname全局变量global$uname;//函数内输出全局变量echo"{$uname}<hr>";//用$GLOBALS引入$pwd并输出echo$GLOBALS['pwd'];}//调用函数info();?>

运行实例 »

点击 "运行实例" 按钮查看在线实例

可以看到能够正常调取运行

1628402430(1).jpg

如果这个函数是一个匿名函数,则调取全局变量就更加简单:

实例

<?php//声明两个全局变量$uname='admin';$pwd=md5('123456');//定义一个匿名函数并调用全局变量$uname跟$pwd$info=function()use($uname,$pwd){//输出两部分内容echo"{$uname}<hr>";echo$pwd;};//调用匿名函数(匿名函数调用变量后面也是需要加()的)echo$info();?>

运行实例 »

点击 "运行实例" 按钮查看在线实例

1628402430(1).jpg

正常输出,而且匿名函数用引用调取的方法还可以改变全局变量的值。

实例

<?php//声明一个全局变量$name='money';//定义一个匿名函数,并引用全局变量$name,前面加&表示引用$closure3=function($newName)use(&$name){//把$newName的值赋给$name$name=$newName;};//调用匿名函数并赋一个新值$closure3('admin');//输出$name查看效果echo$name;?>

运行实例 »

点击 "运行实例" 按钮查看在线实例

可以看到正常把$name的值从money换成了admin

1628403125(1).jpg

更多相关文章

  1. php编程基础0806作业
  2. 利用php循环遍历及运算法则实现重新组合数组与计算器实例两则
  3. 回调函数,递归函数
  4. 对回调函数和递归函数的理解
  5. 回调函数、递归函数
  6. 0806-请实例演绎你对回调函数与递归函数的理解?
  7. php之灭绝回调函数,师太递归函数
  8. 2021年8月6日作业:回调函数和递归函数的认识
  9. PHP:0806回调函数和递归函数的理解

随机推荐

  1. PHP制作的掷色子点数抽奖游戏实例(代码)
  2. php中static关键字的理解
  3. PHP的Phar包原来性能这么强
  4. php利用32进制实现对id加密解密
  5. 详解 PHP 中的三大经典模式
  6. 宿主机nginx与docker的PHP搭配使用
  7. PHP浮点精度问题
  8. PHP变量的初始化以及赋值方式介绍
  9. PHP序列化和反序列化语法差异问题
  10. PHP 编写基本的 Socket 程序