了解函数的基本运用和语法
<?php
function foo($a,$b){
echo $a+$b;
}
foo(20,30);
echo '<hr>';
//函数运用和写法有几种类型:
//1,限制其值:float(浮点型)/string(整数型)
//注意语法:如果函数内使用echo 就不可以使用string。否则会报错,使用return则不报错。尽量使用return来返回。
//使用return也可以省略string/float。
function foo1(int $a,int $b):string
{
return $a+$b;
}
echo foo1(10.1,20.2);
函数定义
<?php
//函数常规写法有:驼峰命名(humpName),蛇形命名(snake_name)函数名、方法名、类名不区分大小写
//1,用户自定义(用户可以根据自己定义一个函数,函数必须由大小字母,下划线,数字组成,且不可以数字开头)
//函数有型参和实参。型参的值可以随实参而改变
//下面获取价格,可以加入float也可以不加入。默认应该就是float
function getPrice($monay,$discount)
{
return '该商品为'."$discount".'折,价格为='.$monay*$discount;
}
echo getPrice(322,0.9);
echo '<hr>';
//2,系统函数
//系统函数指:系统定义好的函数
//mb_substr:获取字符串的部分数据;如下:
//系统定义好的函数,无需使用function。就可以直接使用。
$str="我要从这句话里面获取到前面的7个字";
echo mb_substr($str,0,7);
echo '<hr>';
//3,可变函数:如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途
//可变函数不能用于例如 echo,print,unset(),isset(),empty(),include,require以及类似的语言结
//getPrice就成为了一个函数而不是值
$func="getPrice";
echo '价格我改为:'.$func(1000,0.3);
echo '<hr>';
//4,匿名函数也叫闭包(closures).
//闭包函数也可以作为变量的值来使用
//PHP 会自动把此种表达式转换成内置类 Closure 的对象实例。把一个 closure 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号:
$greet=function ($name)
{
printf("hello %s\r\n",$name);
};//别忘了分号
$greet('word');
$greet('php');
echo '<hr>';
//闭包可以从父作用域中继承变量。 任何此类变量都应该用 use 语言结构传递进去。
$message='hello';
//没有继承 没有use 所以他不能继承或调用$message的数据。结果为NULL
$example=function(){
var_dump($message);
};
echo $example();
echo '<hr>';
//继承 $message 方法如下:
$example=function() use ($message){
var_dump($message);
};
echo $example();
echo '<hr>';
//计算商品价格
$dicscount=0.9;
$paymoney=function ($money,$num) use ($dicscount)
{
$total=$money*$num;
//返回值为:合并(?)运算
return $total>1000 ? $total*$dicscount:$total;
//拆分运算
/*if($total>1000){
return $total=$total*$dicscount;
}*/
};
echo $paymoney(100,31);
echo'<hr>';
//如果父作用域是一个函数?则一个套一个
$paymoney2=function($dicscount){
//把$dicscount传到下面的$discount
return function($money,$num) use($dicscount){
$total=$money*$num;
return $total>3000 ? $total*$dicscount : $total;
};
};
echo $paymoney2(0.8)(202,21);
数组返回,拼接
<?php
//返回值(return)
//可以返回包括数组和对象的任意类型
function test1($num1,$num2){
return $num1+$num2;
//如果省略了 return,则返回值为 NULL。
//$num1+$num2;
}
echo test1(100,20);
echo '<hr>';
//字符串拼装
function test2(){
$num1=3;
$num2='你很成功';
return $num1. '个人过去看你,'.$num2;
}
echo test2();
echo '<hr>';
//数组返回
function test3():array
{
return ['num1'=>1,'num2'=>'我很色'];
}
//print_r(test3());
//打印格式化需要使用printf
$res=print_r(test3(),true);
printf('<per>%s</per>',$res);
//if判断语句,三目运算符
echo test3()['num1'] == 2 ? '<span style="color:red">'.test3()['num2'].'</span>' : '<span style="color:#CCC">色不到你</span>';
echo '<hr>';
function test4():array
{
return $arr=array(1,2,3,4,5,6,7,8,8);
}
print_r(test4());
echo '<hr>';
//将json格式的字符串还原/解析为php对象/数组
//json_decode接受一个 JSON 格式的字符串并且把它转换为 PHP 变量
//$json里面的数据可以理解为k=>v,,a=>1
//assoc 当该参数为 TRUE 时,将返回 array 而非 object 。
$json='{"a":1,"b":2}';
echo $json;
echo '<br>';
var_dump(json_decode($json,true));
echo '<br>';
var_dump(json_decode($json));
echo '<hr>';
//系列化返回多个值
//serialize — 产生一个可存储的值的表示
function test5():string
{
return serialize(['status'=>1, 'message'=>'成功']);
}
echo test5();
echo '<br>';
//返回结果:a(数组):2(有两个元素):{s(第一个元素为sting类型):6(长度=>status):"status";i(整数int):1(值);s:7:"message";s:6:"成功";}//后面类推,3个字节=一个汉字
//需要反序列化才可以使用。
//unserialize — 从已存储的表示中创建 PHP 的值
//%为占位符。%s占位给print_r($arr,trun)
$arr=unserialize(test5());
printf('<pre>%s</pre>',print_r($arr,2));
函数参数
<?php
//函数参数
//1,值参数(值传递)
function test1($num){
return $num*=3;
}
echo test1(30.3);
echo '<br>';
$val=60;
echo test1($val);
echo '<br>';
echo test1($num);//这里是直接印了初始化的$num(并没有赋值,所以结果为:0;
echo '<br>';
//这里没有调用函数就直接输出他的值
echo $val;
echo '<hr>';
//2,引用参数“&”
function test2( &$age){
return $age+=2;
}
$val=10;
test2($val);
//调用函数后,通过 & 找到函数里面的的值
echo $val;
echo '<hr>';
//默认参数
//function test3(float $a,float $b,string $opt="+")先给他定义类型和默认进来是“+”运算
function test3($a,$b,$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="非法操作";
}
//switch计算结果后。rutern返回$res
return $res;
}
$res=test3(100,100,'++');
echo $res;
echo '<hr>';
//剩余参数
//如果我们需要计算 一大串数字,使用(func_num_args,func_get_arg,func_get_args)
function test5(){
//func_num_args-返回传递给函数的参数数(就是我传了多少个数值,他就返回多少个数字
//return func_num_args();//结果为5个数值(索引)
//func_get_arg — 返回参数列表的某一项
//return func_get_arg(3);//需要写入索引,写入第几个索引就显示第几个数值;结果为4
//function_get_args-返回一个包含函数参数列表的数组(array)
//return func_get_args();
$total=0;
//计算逻辑:判断$i++小于func_num_args总共的索引
for($i=0;$i<func_num_args();$i++)
{
//开始计算每一个索引对应的数值就是func_get_arg数值
$total+=func_get_arg($i);
}
return $total;
}
echo test5(1,2,3,4,5);
echo '<hr>';
//剩余参数简写;
//array_sum — 计算数组中所有值的和
//注意写法;
function test6(...$arr){
return array_sum($arr);
}
//下面两种都可以。
echo test6(1,2,3,4,5,6,7,8,9,10).'<br>';
$arr=[1,5,6,78,98,2,2];
echo test6(...$arr);
//错误写法:这种情况也不能使用地址符&
// echo $arr;
echo '<hr>';
//数组解包
//list — 把数组中的值赋给一些变量
//像 array() 一样,这不是真正的函数,而是语言结构。list()用一步操作给一组变量进行赋值。
//简单理解:
$arr=[1,2,3];
list($a,$b,$c)=$arr;
echo $a,'--',$b,'--',$c,'<br>';
$user[]=['xz',20,'man'];
$user[]=['xh',18,'wo'];
$user[]=['xw',50,'si'];
foreach($user as list($name,$age,$gender))
{
printf('<pre>'."name=%s \n"."age=%s \n".'gender=%s'.'</pre>',$name,$age,$gender);
}
回调函数
<?php
//回调函数;
//range — 建立一个包含指定范围单元的数组
//初步理解:
foreach(range(0,10) as $num)
{
echo $num;
}
echo '<br>';
//可以是顺序,也可以是反序
foreach(range(20,10) as $num)
{
echo $num;
}
echo '<br>';
//range就是创建了一个数组array从1~10的数值
foreach(range('a','z') as $en)
{
echo $en;
}
echo '<br>';
//反顺序执行
foreach(range('z','a') as $en)
{
echo $en;
}
echo '<hr>';
$arr=range(0,50);
// echo $arr;
print_r($arr);
echo '<br>';
echo ((4%2)===0) ? "偶数":"奇数";
echo '<br>';
//如果我只需要返回偶数;
//array_map — 将回调函数作用到给定数组的单元上
$res=array_map(function (int $item){
if($item % 2 === 0){
return $item;
}
},$arr);
//过滤奇数,只打印偶数
//printf('<pre>%s<pre>',print_r($res,true));
//array_filter — 用回调函数过滤数组中的单元
$res= array_filter($res,function($item){
return $item;
});
//简单理解:
//print_r(array_values($arr)).'<br>';//执行结果显示和range一样。
//array_values — 返回数组中所有的值
$res=array_values($res);
printf('<pre>%s</pre>',print_r($res,true));
函数命名空间
<?php
//函数命名空间:namespace "名称" 来表示;
namespace ns1{
function test($a,$b):string
{
return $a+$b;
}
}
//中命名空间{}之外可能不存在任何代码,所以下面想输出,必然报错
//echo '<br>';
namespace ns2{
function test():string
{
return __FUNCTION__.'<br>';
}
}
//全局空间
namespace
{
echo \ns1\test(10,10);
ECHO '<BR>';
echo \ns2\test();
}
总结:经过几天时间,对与符号基本上不怎么会打错了。简单的运用还是看的出来的,就是稍微复杂一点的就很难理解。看上去似懂非懂的,复杂一点的就不知道怎么运用了。