<?php
// 函数语法
// 二数求和
//function函数的声明 func1自定义的函数名称 int定义函数是整数 float输入函数为小数
function func1(int $a, int $b) : float
{
// 显式 return隐式返回
return $a + $b;
// 隐式: 结束大括号的时候会自动返回
}
// 函数调用: 按名称
echo func1(10.5, 20.3);
echo '<hr>';
// 自定义函数 getPrice名称为自定义 float为小数 float输出为小数
function getPrice(float $money, float $discount) : float
{
// 隐式返回 乘
return $money * $discount;
}
// 打印'实付金额: '打印的文字 getPrice自定义的变量名称 1000*0.5 打5折
echo '实付金额: ' . getPrice(1000, 0.5);
echo '<hr>';
// 2. 系统函数
// function mb_substr()为系统预制函数 直接打印调用
$str = '哈尔滨防控漏洞为全国敲响新的警钟';
// 仅获取前5个字符
echo mb_substr($str, 0, 5);
echo '<hr>';
// 3. 可变函数
// 变量的内容为函数名称
$funcName = 'getPrice';
echo '实付金额: ' . $funcName(2000, 0.5);
echo '<hr>';
// 4. 匿名函数: 闭包/循环, 可以访问父作用域的变量
$discount = 0.5;
// $discount 的作用域是全局
// 把整段函数放到变量里面 float $money为价格可以是小数 int $num为数量 整数 float输出小数
$getAmount = function (float $money, int $num) use ($discount) : float
{
// 执行乘 单价乘数量
$amount = $money * $num;
// 隐式输出 前如果amount钱 大于等于2000 就打折 0.6 :如果不大于就原价
return $amount >= 1000 ? $amount * $discount : $amount;
};
echo '实付金额: ' . $getAmount(200, 20);
echo '<hr>';
// 如果父作用域又是一个函数 函数里面套函数
$f = function ($discount) {
// 子函数
// 隐式输出 money钱数 num折扣 use ($discount) 访问全局变量
return function (float $money, int $num) use ($discount) : float
{
// 金钱=钱数*折扣
$amount = $money * $num;
// 隐式输出 如果钱数大于等于2000 打折数discount 否则 amount原价
return $amount >= 1000 ? $amount * $discount : $amount;
};
};
// $a = var_dump($f(0.6));
// echo gettype( $f);
// $tmp = $f(0.6);
// echo '实付金额: ' .$tmp(200, 20);
echo '实付金额: ' .$f(0.1)(100, 20);
// 200 * 20 = 4000 * 0.6 = 2400
echo '<hr>';
echo '<hr>';
// 返回值
// 原则: 单值返回
// 如果需要返回多值
// 1. 字符串拼装
// 2. 数组
// 3. JSON字符串
// 4. 序列化: 字符串
// 1. 字符串拼装
// demo1() 自定义变量 string输出字符串类型
function demo1() : string
{
$status = 1;
$message = '成功';
return $status .': ' . $message;
}
echo demo1();
echo '<hr>';
// 适合处理大量的php+html混写
// 这种返回的格式是用户自定义的,前端处理非常麻烦
// 2. 通过数组
// demo1() 自定义变量 array输出字符串类型
function demo2() : array
{
// 隐式输出 'status'=>10,定义验证类型 message正确则返回成功
return ['status'=>10, 'message'=>'成功'];
}
// echo '<pre>'.print_r(demo2(), true).'</pre>';
// print_r字符串打印 加上true格式化打印
$res = print_r(demo2(), true);
// 把内容放到res 在打印res
printf('<pre>%s</pre>', $res);
// 最后打印demo2() 给值为10 span定义成功的颜色 ?是10则成功 否则验证失败
echo demo2()['status'] == 10 ? '<span style="color:green">'.demo2()['message']. '</span>' : '验证失败';
echo '<hr>';
// 3. 通过JSON返回
// json: 是用js对象字面量的方式来表示数据,是一种轻量级通用的数据交换或传输格式
// json本质上就是一个具有一定结构和格式的字符串, 不过这种格式得到了公认,几乎所有编程语言都有支持它的接口
// demo1() 自定义变量 array输出字符串类型
function demo3() : string
{
// json_encode(): 将php数据编码为json格式的字符串返回
return json_encode(['status'=>1, 'message'=>'成功']);
}
$data = demo3();
echo $data;
// 将json格式的字符串还原/解析为php对象/数组 将要输出的放到变量var里面
$var = json_decode($data, true);
// 打印变量
print_r($var);
echo '<hr>';
// 4. 通过序列化返回多个值
// 其实json也是一种序列化
// demo1() 自定义变量 array输出字符串类型
function demo4() : string
{
// serialize序列化
return serialize(['status'=>1, 'message'=>'成功']);
}
echo demo4();
// 反序列化才可以使用 否则返回详细参数
// 将内容放到变量里面
$arr =unserialize(demo4());
// 打印变量
printf('<pre>%s</pre>', print_r($arr,true));
echo '<hr>';
echo '<hr>';
// 函数参数
// 1. 值参数
// 2. 引用参数
// 3. 默认参数
// 4. 剩余参数
// 1. 值参数, 默认
// 定义一个函数为demo10 为小数类型arg 输出也是小数
function demo10(float $arg) : float
{
// 隐式输出 *=2
return $arg *= 2;
}
$value = 100;
// 打印 100*2
echo demo10($value) , '<br>';
// 在函数中改变了调用参数的值,但原始调用参数并没有发生变化
echo $value;
echo '<hr>';
// 2. 引用传递 arg前面加上& 值会累加
function demo20(float &$arg) : float
{
return $arg *= 2;
}
$value = 100;
echo demo20($value) , '<br>';
// 如果在参数前面使用了取地址符,则会改变原始调用参数的值
echo $value;
echo '<hr>';
// 3. 默认参数
// 默认参数必须写在必选参数的后面
// 定一个函数为demo30 小数小数 string默认执行+
function demo30(float $a, float $b, 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 demo30(10, 20, '*'), '<br>';
// echo demo3(10, 20, '*'), '<br>';
// echo demo3(10, 20, '#'), '<br>';
echo '<hr>';
echo '<hr>';
// 4. 剩余参数
function demo40(float $a, float $b, float $c ) : float
{
return $a + $b + $c;
}
// 计算三个数之和
echo demo40(1,2,3), '<br>';
echo '<hr>';
function demo50( )
{
// 参数数量
// return func_num_args();
// 根据索引返回指定的调用参数
// return func_get_arg(2);
// return func_get_args();
$total = 0;
// for ($i = 0;$i <func_num_args(); $i++ ) {
// $total +=func_get_arg($i);
// }
// return $total;
foreach (func_get_args() as $value) {
$total +=$value;
}
return $total;
}
// echo demo5(3,4,7,8,24);
print_r(demo50(3,4,7,8,24));
echo '<hr>';
// echo demo5(1,2,3,4,5,6,9,22,67), '<br>';
// 使用剩余参数简化
// ...: 参数归纳:
function demo6(...$args ) : float
{
// return $args; array_sum 求和参数 求和args
return array_sum($args);
// rray_product求积
// return array_product($args);
}
// print_r(demo6(3,4,7,8,24));
// echo demo6(1,2,3,4,5,6,9,22,67), '<br>';
// 调用参数
// 将内容放到一个变量里面
$arr = [1,2,3,4,5,6,9,22,67];
// ...:
// 1. 用在函数的形式参数列表中,表示"收集",将多个离散的参数打包到一个数组中处理
// 2. 用在函数的调用参数列表中,表示"展开",还原将一个数组展开成一个个离散的值
// 打印 demo6 ...展开 arr里面的内容
print_r(demo6(...$arr));
echo '<hr>';
// $config = ['localhost', 'phpedu', 'uft8', '3306'];
// $dsn = 'mysql:host=localhost;dbname=phpedu;charset=utf8;port=3306';
// $db = [$dsn, $username, $password];
// $pdo = new PDO(...$db);
// 扩展知识
$user[] = [100, 'admin', 90];
$user[] = [110, 'peter', 60];
$user[] = [120, 'jack', 98];
// 数组解包
// js中解构赋值, php中也有解构
foreach ($user as list($id, $name)) {
printf('id=%s, name=%s<br>', $id, $name);
}
个人总结:
整体都能学明白,需要加深对英文词语的认识,继续努力!