1、函数的参数:
定义一个命名函数或者匿名函数的时候,所设置的参数为形参,当调取这个函数进行执行的时候,所传的参数为实参。
多个参数可以用,隔开。
如果函数定义的时候设置了形参,那么调用这个函数的时候就必须传实参,如果没有设置形参,调用的时候可以不传实参。
如果没有参数 函数的执行任务是固定的
那么有小伙伴可能会问,我定义了一个函数,设置了形参,这个形参需要前端传给我,但是前端比较傲娇有时候不给可咋办,或者产品经理安排一个任务让做一个表格,就是给了个大面儿的需求让先出个给她看看后面再无限期修改又咋办,首先不(zou)要(ta)生(yi)气(dun),这个时候我们可以封装一个函数,然后给函数的形参赋一个初始值,这样调用函数的时候就算不传值也可以直接运行,但是需要注意:
调用函数所传的参数一定是从左到右读的
只能说是前面有参数后面空着如传(8,9),也就是不传参数或少传参数,后面的都会使用默认值,传了参数就会发生覆盖,但是不能前面空着后面有参数("他","hotpink"),这个就是错误的。
那么有的用户就是想只传过几个参数来,其他的默认咋整?(我觉得可以用IF语句做判断来进行调整,比如判定空或者输入的内容错误就输出默认值或者报错,否则就正常使用输入的信息)。
<?php //建立一个创建表格的函数为例,设置4个形参行rows、列cols、表格内字符$content、表格颜色样式$bgColor,并分别给定类型、赋初始值 function createTable1(int $rows = 7, int $cols = 8,string $content = '打',string $bgColor = 'red'):string { //创建一个表格的table标签 $table = "<table border='1 cellspacing='0 bgColor='$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; } echo createTable1(); ?>
点击 "运行实例" 按钮查看在线实例
可以用function_exists();判断是否有次函数。
剩余参数"..." 适用于参数的个数不确定的情况,一般用在数据库的链接,下面先举个简单的例子:
<?php //定义一个函数,参数个数不确定 function test(...$args) { //返回数组内所有数的和 return array_sum($args); } //输出函数 echo test(123,12415,1221341,111,24,1,5); ?>
2、函数的返回值
在定义的函数中,可以用return语句返回一个值,这里需要注意
1.函数只能返回单个值,函数遇到return就会停止执行后面的代码,遇到return即结束。
2.函数的返回值,也可以返回数组、对象、或者是一个函数,其中如果返回值是函数也是不能用echo来输出的。
<?php //定义一个函数demo() function demo(){ //设置多个return return '66'; return 'admin'; return true; } //因为不确定最终能输出什么内容,这里我们用var_dump来输出函数 var_dump(demo()); ?>
从结果中可以看到函数输出了66就停止了后面没再往下执行
如果想输出多个值,可以以数组、对象的形式返回:
<?php //多个值以数组的形式返回 //定义一个函数demo() function demo() { //返回一个数组 return ['status'=>1,'msg'=>'登录成功']; } //输出demo() print_r (demo()); //多个值以对象的形式返回 //定义一个函数demo2() function demo2() { //返回一个类实例(对象) return new class() { public $name = 'admin'; public $gender = '女'; }; } //将函数赋值给$obj $obj = demo2(); //输出$obj var_dump($obj); //获取对象里的name echo $obj->name; ?>
之前在php变量的类型与转换及变量与常量的区别说到过php全局成员:常量、函数、类、接口,其实严格点来说,应该是:常量、命名函数、类、接口。
匿名函数,匿名函数说白一点就是不带名字的函数,像如命名函数都是带名称,可以使用名称直接调用的如:
<?php //定义一个名叫divide的命名函数 function divide($one,$two) { //返回两个参数的商 return $one/$two; } //用名称就能输出这个函数 echo divide(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 //定义一个函数 function info() { //声明变量 $uname = 'admin'; //函数内输出变量 echo $uname; } //调用函数 info(); //函数外尝试调用局部变量 echo $uname; ?>
点击 "运行实例" 按钮查看在线实例
可以看到函数能正常输出,函数外调用变量失败,函数内的变量严格受作用域限制,无法在外部使用
但是函数体外定义的全局变量就能随便调用嘛?
可以做一个尝试,把上面的代码改一下:
<?php //声明一个全局变量 $uname = 'admin'; //定义一个函数 function info() { //函数内输出全局变量 echo $uname; } //调用函数 info(); ?>
点击 "运行实例" 按钮查看在线实例
哦吼。。。跟上面报了一样的错误:
那全局变量都调取不了嘛?其实不是的,全局变量在函数内调用可以用global 超全局变量 跟$GLOBALS 超全局数组引入:
<?php //声明两个全局变量 $uname = 'admin'; $pwd = md5('123456'); //定义一个函数 function info() { //用global引入$uname全局变量 global $uname; //函数内输出全局变量 echo "{$uname}<hr>"; //用$GLOBALS引入$pwd并输出 echo $GLOBALS['pwd']; } //调用函数 info(); ?>
点击 "运行实例" 按钮查看在线实例
可以看到能够正常调取运行
如果这个函数是一个匿名函数,则调取全局变量就更加简单:
<?php //声明两个全局变量 $uname = 'admin'; $pwd = md5('123456'); //定义一个匿名函数 并调用全局变量$uname跟$pwd $info = function()use($uname,$pwd) { //输出两部分内容 echo "{$uname}<hr>"; echo $pwd; }; //调用匿名函数(匿名函数调用变量后面也是需要加()的) echo $info(); ?>
点击 "运行实例" 按钮查看在线实例
正常输出,而且匿名函数用引用调取的方法还可以改变全局变量的值。
<?php //声明一个全局变量 $name = 'money'; //定义一个匿名函数,并引用全局变量$name,前面加&表示引用 $closure3 = function($newName) use (&$name) { //把$newName的值赋给$name $name = $newName; }; //调用匿名函数并赋一个新值 $closure3('admin'); //输出$name查看效果 echo $name; ?>
点击 "运行实例" 按钮查看在线实例
可以看到正常把$name的值从money换成了admin