函数
1.函数语法
- 函数是实现代码复用的重要方式,在所有编程语言中均如此
function 函数名称(类型: 参数列表): 返回值类型
{
// 函数体
return 返回值;
}
序号 |
名称 |
描述 |
1 |
function |
声明函数 |
2 |
函数名称 |
符合 PHP 标识符命名规范,不区分大小写 |
2 |
参数列表 |
零个或多个接收外部传入到函数的变量 |
2 |
{... |
创建出一个封闭的函数作用域 |
2 |
函数体 |
由零个可多个合法的 PHP 语句组成 |
2 |
return 值 |
将执行结果返回函数调用者[可选] |
2 |
...} |
函数执行结束,如果没有return ,则返回null |
<?php
// 函数语法
//函数的声明
function test( $c , $a = 10 , $b = 20){
echo $a + $b + $c;
}
test( 30 );
2. 类型
序号 |
类型 |
语法 |
描述 |
1 |
自定义函数 |
function getName(){...} |
用户根据业务需求创建 |
2 |
系统函数 |
substr(), count()... |
也叫预定义函数,不必声明直接调用 |
3 |
可变函数 |
$funcName(); |
函数名使用变量表示 |
4 |
匿名函数 |
$f = function (){...} |
也叫”闭包”或”函数表达式”,常用做回调处理 |
<?php
// 函数
// 1. 自定义函数
// 2. 系统函数
// 3. 可变函数
// 4. 匿名函数:
// testone: 小驼峰命名法
// get_price: 蛇形命名法
// 命名函数
function testOne(){
echo 'hello';
}
$a = 'testOne'; // 调用 testOne()函数
$a();
echo '<hr>';
// 2. 系统函数
// function mb_substr(){
// //....
// }
$str = 'PHP中文网';
// 仅获取前5个字符
echo mb_substr($str, 0, 3);
echo '<hr>';
// 3. 可变函数
function test1(){
echo "可变函数<br />";
}
$f1 = "test1";
$f1();
echo '<hr>';
// 4. 匿名函数:
$names = function($name)
{
printf("这里是%s\r\n", $name);
};
$names('匿名函数');
3. 返回值
序号 |
场景 |
描述 |
1 |
return |
可以返回任何类型的值,包括函数类型 |
2 |
无return |
遇到} 也会返回, 默认返回null |
序号 |
返回值类型 |
描述 |
1 |
string |
字符串拼接 |
2 |
array |
数组 |
3 |
json |
JSON 字符串 |
4 |
serialize |
序列化字符串 |
json 和序列化,使用时需要进行解码操作
<?php
// 返回值
// 原则: 单值返回
// 如果需要返回多值
// 1. 字符串拼装
// 2. 数组
// 3. JSON字符串
// 4. 序列化: 字符串
// 1. 字符串拼装
function test1(){
$i='I';
$love=' Love';
$you=' You';
//连接一下三个字符串
echo $i.$love.$you;
}
echo test1();
echo '<hr>';
// 2. 通过数组
function theMan() : array
{
return ['age'=>22, 'height'=>170, 'weight'=>60];
}
echo '年龄'.theMan()['age'].'岁,身高为'.theMan()['height'].'cm,体重为'.theMan()['weight'].'kg';
echo '<hr>';
// 3. 通过JSON返回
function theWoMan() : string
{
// json_encode(): 将php数据编码为json格式的字符串返回
return json_encode(['age'=>30, 'height'=>150, 'weight'=>65]);
}
// 将json格式的字符串还原/解析为php对象/数组
$arr = json_decode(theWoMan(), true);
print_r($arr);
echo '<hr>';
// 4. 通过序列化返回多个值
// 其实json也是一种序列化
function girl() : string
{
return serialize(['age'=>15, 'height'=>140, 'weight'=>40]);
}
echo girl();
// 反序列化才可以使用
$arr =unserialize(girl());
printf('<pre>%s</pre>', print_r($arr,true));
4. 参数
- 调用者可以通过参数将数据传递到函数中
- 参数是以逗号分隔的表达式列表
- 参数按照从左到右的顺序求值
参数类型
序号 |
类型 |
描述 |
1 |
值参数 |
默认传参方式 |
2 |
引用参数 |
改变原始调用参数值 |
3 |
默认参数 |
调用时允许省略的参数 |
4 |
剩余参数 |
调用参数数量不确定 |
<?php
// 函数参数
// 1. 值参数
// 2. 引用参数
// 3. 默认参数
// 4. 剩余参数
// 1. 值参数, 默认
function testOne(string $add) : string
{
return $add='你走错厕所了';
}
$there = '这里是女厕所';
echo testOne($there) , '<br>';
// 在函数中改变了调用参数的值,但原始调用参数并没有发生变化
echo $there;
echo '<hr>';
// 2. 引用传递
function testTwo(string &$add) : string
{
return $add='这里是女厕所';
}
$there = '你走错厕所了';
echo testTwo($there) , '<br>';
// 如果在参数前面使用了取地址符,则会改变原始调用参数的值
echo $there;
echo '<hr>';
// 3. 默认参数
// 默认参数必须写在必选参数的后面
//自定义一个函数test3,用于打印一个人的属性
function testThree($name="张三", $age=20, $sex="男"){
echo "姓名:{$name}, 年龄:{$age}, 性别:{$sex} <br>";
}
testThree(); //全部使用默认参数
testThree("李四"); //第一个默认参数被覆盖,后面两个参数为默认
testThree("李四",18); //前两个默认参数被覆盖,后面一个参数为默认
testThree("李四",18,"女"); //三个默认参数都被覆盖
echo '<hr>';
// 4. 剩余参数
function testTset( )
{
$number = 0;
foreach (func_get_args() as $value) {
$number +=$value;
}
return $number;
}
print_r(testTset(1,2,3,4,5));
echo '<hr>';
// 使用剩余参数简化
// ...: 参数归纳:
function testForm(...$par){
$sum=1;
foreach ($par as $v)
{
$sum *=$v;
}
return $sum;
}
print_r(testForm(1,2,3,4,5));
echo '<hr>';
课后总结:
部分不能理解,大多数还是可以理解的,可能以后到开发中应该能慢慢明白