Correcting teacher:Guanhui
Correction status:qualified
Teacher's comments:写的很好!代码要注意规范!
function 函数名称的标识符(参数列表){
//函数体,由一条或多条语句组成,也可以为空
}
标识符:必须满足php标识符的基本要求,只允许字母数字或下划线不允许用数字开头
函数:代码复用的重要手段
变量:数据复用的重要手段
//声明
function sum(int $a,int $b):int
{
//return :将函数的执行结果返回到调用者
return $a + $b;
}
//调用
echo sum(100,100);
//1.自定义函数
function getPrice(float $money,float $discount):float
{
return $money * $discount;
}
echo '实付金额 = ' . getPrice(5000,0.6),'<hr>';
//2.系统函数
$str = "函数调用机制,改进函数调用机制,通过优化参数传递环节,减少了一些指令";
//字符串截取
//echo '字符串截取mb_substr()系统函数:' . mb_substr($str,0,6),'<hr>';
//3.可变函数
$funcName = 'getPrice';
echo '(可变函数)实付金额 = ' . $funcName(5000,0.6),'<hr>';
//4.匿名函数
//拥有名称的函数叫:命名函数/具名函数
$get = function(float $money,float $discount):float
{
return $money * $discount;
};
echo '(匿名函数)实付金额 = ' . $get(10000,0.6),'<hr>';
<?php
//匿名函数,也叫闭包函数,允许临时创建一个没有指定名称的函数。最经常用作回调函数参数的值
//闭包函数也可以作为变量的值来使用
//闭包可以从父作用域中继承变量,任何此类变量都应该用 use 语言结构传递进去
//父作用域就是父函数
$f = function($discount){
$p = function (float $money,int $n) use ($discount):float
{
$total = $money * $n;
return ($total > 20000) ? ($total * $discount) : $total;
};
//将子函数以返回值的方式返回给调用者
return $p;
};
echo '实付金额 = ' . $f(0.8)(3000,10),'<hr>';
<?php
//函数必须要有返回值
//函数只能返回单一的值
function f()
{
}
var_dump(f());
echo '<hr>';
//返回多值
//1.通过字符串拼装
function demo1():string
{
$status = 1;
$message = '成功';
return $status.','.$message;
}
echo '字符串拼装:'.demo1(),'<hr>';
//通过数组返回
function demo2():array
{
$status = 1;
$message = '成功';
return ['status' => $status, 'msg' => $message];
}
echo '数组返回:'.demo2()['msg'],'<hr>';
//3.json:是js对象字面量的字符串表示
function demo3():string
{
$status = 0;
$message = '成功';
return json_encode(['status' => $status, 'msg' => $message]);
}
echo 'js对象字面量的字符串表示:'.demo3(),'<br>';
$data = json_decode(demo3(),true);
print_r($data);
echo '<hr>';
//4.序列化方式
echo serialize([1,2,3]),'<br>';
function demo4():string
{
$status = 1;
$message = '成功';
return serialize(['status' => $status, 'msg' => $message]);
}
echo '序列化:'.demo4(),'<br>反序列化:';
print_r(unserialize(demo4()));
<?php
//函数中的参数
//1.值参数,这是默认
function demo1(float $arg): float
{
return $arg *= 2;
}
$val = 100;
echo '原来的值:'.$val,'<br>';
echo '值参数:'.demo1($val),'<br>';
echo '现在的值:'.$val,'<hr>';
//2.引用参数,要在参数前添加取地址符&
function demo2(float &$arg):float
{
return $arg *= 2;
}
$val = 100;
echo '原来的值:'.$val,'<br>';
echo '引用参数:'.demo2($val),'<br>';
echo '现在的值:'.$val,'<hr>';
//3.默认参数
//凡是有默认值的参数,必须写到没有默认值参数的后面
function demo3(float $a=2,float $b=4,string $opt = '+')
{
$res = 0;
switch ($opt){
case '+':
$res = "$a + $b = " . ($a + $b);
break;
case '-':
$res = "$a - $b = " . ($a - $b);
break;
case '*':
$res = "$a * $b = " . ($a * $b);
break;
case '/':
$res = "$a / $b = " . ($a / $b);
break;
default:
$res = "非法操作符";
}
return $res;
}
echo '不传任何参数:'.demo3(),'<br>';
echo '不传操作符:'.demo3(100,100),'<br>';
echo '传参数:'.demo3(100,5,'*'),'<br>';
echo '传错参数:'.demo3(100,5,'#'),'<hr>';
//4.剩余参数
function add($a,$b,$c)
{
return $a + $b +$c;
}
echo add(1,2,3),'<br>';
//剩余参数用在函数的参数列表中:收集
function add1(...$s)
{
return array_sum($s);
}
//调用参数数量不固定
//将剩余参数用在函数的调用表达式中,是:展开
$arr = [1,2,3,4,5,6,7,8,9];
$res = add1(...$arr);
print_r($res);
<?php
//回调函数,匿名函数,闭包
//异步编程中的函数的参数
$data = range(1,100);
$arr = array_map(function($item){
//array_map — 为数组的每个元素应用回调函数
if($item % 2 === 0) return $item;
},$data);
print_r($arr);
//过滤掉空值
$res = array_filter($arr,function($item){
//array_filter — 用回调函数过滤数组中的单元
return $item;
});
print_r(array_values($res));
//array_values() 返回 input 数组中所有的值并给其建立数字索引
<?php
//函数的命名空间
//只要用到命名空间,全部代码都要用命名空间
namespace ns1{
function demo1(){return '命名空间1';}
}
namespace ns2{
function demo1(){return '命名空间2';}
}
//全局空间:匿名空间,默认空间
namespace{
function demo1(){return '命名空间3';}
echo \ns1\demo1();
}
声明:function 函数名(){}
调用: echo 函数名();
函数名:由字母数字下划线组成,不能以数字开头
自定义函数
系统函数,系统预定义的函数,不需要自己定义
可变函数,把函数名赋值给一个变量,通过变量来调用
匿名函数,也叫闭包函数,临时创建一个没有指定名称的函数,经常用作回调函数参数的值
函数必须要有返回值,没有返回值会出错
函数不能返回多个值,但可以通过返回一个数组、字符串拼接、js对象字面量的字符串、序列化方式来得到类似的效果
json_encode([]);通过js对象字面量的字符串来表示
serialize([]);通过序列化方式来表示 unserialize反序列化
值传递参数(默认)
引用传递参数 ,在函数定义中参数的前面加上符号 &
凡是有默认值的参数,必须写到没有默认值参数的后面
剩余参数用在函数的参数列表中是:收集,用在函数的调用表达式中是:展开
…表示多个参数 array_sum()求数组所有元素的和
回调函数,匿名函数,闭包
array_map — 为数组的每个元素应用回调函数
array_filter — 用回调函数过滤数组中的单元
array_values() 返回 input 数组中所有的值并给其建立数字索引
只要用到命名空间,全部代码都要用命名空间
namespace 命名空间名称 {}
namespace {} 全局空间:匿名空间,默认空间