- 变量与常量的区别与创建,访问方式
变量
- 变量是临时存储数据的容器;是实现数据复用的手段;
- 变量名区分大小写;函数不区分大小写。如$username和$userName
- 变量名必须使用$符号开始;不允许使用数字开始;必须使用字母或下划线开始,后面允许使用数字。
- 访问方式:可用echo输出,没有返回值,效率最高;如:$a=’abs’; echo $a;
常量
- 常量是在当前脚本中不允许更改的变量(也叫只读变量),不受作用域访问限制;
- 常量创建的时候必须初始化,且常量名尽量使用大写字母;
- 常量创建分为关键字const和函数define();
- 关键字创建,如: const USER_NAME=’猪猪’;
- define()函数创建, define(常量名称,对应的常量值):对应的常量值可以为数组、integer(整数)、float(浮点)、string(字符串)、boolean(布尔)类型的值;如:define(‘AGE’,20);
- 类中的常量只能用const,如:class user{
const CITY =’CHINA’; }
- 访问方式:可用echo输出,没有返回值,效率最高;如:echo CITY;但当常量名变量化后,只能用函数来获取。如:$b=’CITY’; echo constant($b);
变量过滤器的常用函数与用法
// 1)过滤单个变量:filter_var():通过指定的过滤器过滤一个变量
$age=30;
var_dump(filter_var($age,FILTER_VALIDATE_INT));//FILTER_VALIDATE_INT:把值作为整数来验证。
echo '<br>';
$age=70;
$options=['options'=>['min_range'=>18,'max_range'=>60]];
var_dump(filter_var($age,FILTER_VALIDATE_INT,$options));//检测数值是否在$options范围内
echo '<hr>';
$email='admin.qq.com';
$a='admin@qq.com';
var_dump(filter_var($email,FILTER_VALIDATE_EMAIL));//FILTER_VALIDATE_EMAIL:检测变量是否符合 e-mail 地址的要求
echo '<br>';
var_dump(filter_var($a,FILTER_VALIDATE_EMAIL));
// 2)过滤多个变量:filter_var_array()
$a=10;
$b='abc';
$c='33';
var_dump(filter_var_array([$a,$b],FILTER_VALIDATE_INT));
echo '<br>';
var_dump(filter_var_array([$a,$c],FILTER_VALIDATE_INT));
echo '<br>';
var_dump(filter_var_array([$a,$b,$c],FILTER_VALIDATE_INT));
echo '<hr>';
//3)验证外部变量(不在当前脚本中创建的变量,如GET、POST发送过来的变量);filter_input():验证单个外部变量
//?id=30:查询字符串
echo 'id=' .$_GET['id'];
//filter_input(输入类型get/post,字符串表示的变量名,过滤器,选项参数)
$options=['options'=>['min_range'=>1]];
var_dump(filter_input(INPUT_GET,'id',FILTER_VALIDATE_INT,$options));
echo '<hr>';
//同时验证多个外部变量:filter_input_array()
$args=[
'name'=>FILTER_SANITIZE_STRING,//FILTER_SANITIZE_STRING:去除标签,去除或编码特殊字符
'email'=>FILTER_VALIDATE_EMAIL,//FILTER_VALIDATE_EMAIL: 把值作为 e-mail 地址来验证
'age'=>['filter'=>FILTER_VALIDATE_INT,'options'=>['min_range'=>18,'max_range'=>60]],//FILTER_VALIDATE_INT: 把值作为整数来验证
'blog'=>FILTER_VALIDATE_URL,//FILTER_VALIDATE_URL: 把值作为 URL 来验证
];
var_dump(filter_input_array(INPUT_GET,$args));
函数的类型
函数类型分为自定义函数、系统函数、可变函数、匿名函数//1、函数类型:自定义函数、系统函数、可变函数、匿名函数
// 1)自定义函数
// 计算折扣价
function getPrice(float $money,float $discount):float
{
return $money *$discount;
}
echo '实付金额:',getPrice(5600,0.7),'元<hr>';
// 2)系统函数/内置函数:由系统事先声明,用户只需调用即可
$a='中医养生,就是指通过各种方法颐养生命、增强体质、预防疾病,从而达到延年益寿的一种医事活动。所谓生,就是生命、生存、生长之意;所谓养,即保养、调养、补养之意。';
//mb_substr($str,$start,$length):$str必需,表示从该处提取字符串;
// $start必需,表示在字符串的何处开始提取,0表示从第一个字符串开始,正数表示在字符串的指定位置开始,负数表示从字符串结尾的指定位置开始;
// $length可选,表示规定提取的字符串的长度,默认时字符串的结尾
echo mb_substr($a,0,10),'<br>';
echo mb_substr($a,10,10),'<br>';
echo mb_substr($a,-10,10),'<hr>';
// 3)可变函数:将函数的名称放在一个变量中进行调用
$a='getPrice';
echo '实付金额:'.$a(900,0.2).'元<hr>';
// 4)匿名函数:没有名称
// 没有名称的叫函数表达式,可将其赋给一个变量,叫赋值语句,后面需要加分号;
$b=function (float $money,float $discount):float
{
return $money *$discount;
};
echo '实付金额:'.$b(900,0.4).'元<hr>';
//匿名函数在PHP中也叫闭包,闭包也是一个函数,可以访问上一级空间的成员
//将折扣率变量声明到它的全局空间,也就是它的父作用域中
$p=0.6;
$b=function (float $money) use($p):float{
return $money*$p;
};
echo '实付金额:'.$b(900).'元<hr>';
//闭包是匿名函数最常用的应用场景之一;闭包是一个子函数,全局不可见,但是它的父函数可见
//闭包全局无法调用,可以当成父函数的返回值返回到全局,它可以将函数中的一些内容带给全局使用
//因为函数一旦调用完成,内部全部释放掉,外部不再能访问,外部不能访问函数中的私有成员
//函数中的私有成员,可以通过它的子函数(闭包)返回到全局供它使用
$a=function ($b){
$c=function (float $money,int $n) use($b){
$local=$money*$n;
return ($local>2000) ? ($local*$b):$local;
};
return $c;
};
echo '实付金额:'.$a(0.5)(900,10).'元<hr>';
函数的返回值方式
//函数的返回值
// 函数必定由返回值,且只支持单值返回;但可以通过以下几种方式进行多数值返回(间接方式实现)
//1、通过字符串拼接返回多值
function demo1():string{
$a=1;
$b='你好';
return $a.'.<b>'.$b.'</b>';
}
echo demo1();
echo '<hr>';
//2、通过数组返回多值
function demo2():array{
$a=2;
$b='你好';
return ['a'=>$a,'b'=>$b];
}
//打印数组,是将数据拆分成2膈字符串
echo implode(',',demo2()),'<hr>';
echo print_r(demo2(),true),'<hr>';
//3、通过jsons格式化字符串返回多值
function demo3():string{
$a=3;
$b='你好';
return json_encode(['a'=>$a,'b'=>$b]);
}
echo demo3(),'<hr>';
$jsonStr=demo3();
echo '<hr>';
//4、将返回值序列化成字符串返回多个值
// 序列化是将变量的值转为字符串表示,可以很方便进行存储和传输
echo serialize('hello world'),'<br>';//字符串序列化
echo serialize([1,2,3,4]),'<br>';//数组序列化
function demo4():string{
$a=4;
$b='你好';
// 将返回值序列化成字符串返回多个值
return serialize(['a'=>$a,'b'=>$b]);
}
echo demo4();
echo '<hr>';
$arr=unserialize((demo4()));
print_r($arr['b']);
echo '<br>';
print_r($arr);
函数的参数
//函数的参数
//1、值参数:值传递参数,这是默认的方式
function demo1(float $a):float{
//在函数中对参数的改变不会映射到外部的参数
return $a*2;
}
$b=100;
echo demo1($b),'<br>';
echo $b,'<hr>';
//2、引用参数:在参数前添加取地址符:&
function demo2(float &$a):float{
//在函数中对参数的改变会映射到外部的参数
return $a=$a+20;
}
$b=100;
echo demo2($b),'<br>';
echo $b,'<hr>';
//3、默认参数
function demo3(float $a,float $b,string $opt='+'):string{
switch($opt){//switch 语句用于根据多个不同条件执行不同动作
case'+':
//sprintf() 函数把格式化的字符串写入一个变量中;sprintf(format,arg1,arg2,arg++)
//format必需。规定字符串以及如何格式化其中的变量;%d - 包含正负号的十进制数(负数、0、正数);%s - 字符串
//arg1必需。规定插到 format 字符串中第一个 % 符号处的参数;arg2可选。规定插到 format 字符串中第二个 % 符号处的参数;arg++可选。规定插到 format 字符串中第三、四等等 % 符号处的参数
return sprintf('%d+%d=%d',$a,$b,($a+$b));
break;
case'-':
return sprintf('%d-%d=%d',$a,$b,($a-$b));
break;
case'*':
return sprintf('%d*%d=%d',$a,$b,($a*$b));
break;
case'/':
if($b!==0)
return sprintf('%d/%d=%f',$a,$b,($a/$b));//%f - 浮点数
else die('除数不能为0');
break;
default:
die('非法操作符');
}
}
echo demo3(10,20,'+'),'<br>';
echo demo3(20,20),'<hr>';//'+'为默认值,可以省略
echo demo3(10,20,'-'),'<br>';
echo demo3(10,20,'*'),'<br>';
echo demo3(10,20,'/'),'<br>';
// echo demo3(10,0,'/'),'<br>';
// echo demo3(10,2,'!'),'<br>';
echo '<hr>';
$a='php.cn';
$b='123';
echo sprintf("%s欢迎%d",$a,$b),'<hr>';
//4、剩余参数:...rest,...spread语法
function demo4($a,$b){
return $a+$b;
}
echo demo4(1,2),'<br>';
function demo5(){
// print_r(func_get_args());//func_get_args():获取函数参数列表的数组
return array_sum(func_get_args());//对函数进行求和
}
echo demo5(1,2,3,4,5,6),'<br>';
function demo6(...$args){
//...args:将传给参数的所有参数全部压到一个数组(args)中
return array_sum($args);
}
echo demo6(1,2,3,4,5,6),'<br>';
function demo7(...$args){
return array_sum($args);
}
$data=[1,2,3,4,5,6,7];
//...spread在调用参数时,用在具体值的参数列表,也就是实参中
echo demo7(...$data),'<br>';
echo demo7(...[1,2,3]),'<hr>';//可以将$data替换成具体数组
//...name:当用在调用参数中时是展开功能;当用在声明参数中时是归纳功能
函数的回调执行方式
//函数回调
function demo1($a,$b){
return $a+$b;
}//直接调用(同步调用):这条调用语句不执行完成,后面的语句不会被执行
echo demo1(1,2),'<br>';
//当一个函数在执行过程中存在不可预测性时,不宜同步调用,应用回调方式来执行
//call_user_func():把第一个参数作为回调函数调用;第一个参数是被调用的回调函数,其余参数是回调函数的参数
echo call_user_func('demo1',1,2),'<br>';
echo call_user_func_array('demo1',[1,2]),'<hr>';//call_user_func_array:数组式传参
//当demo1()函数在执行时非常耗时,此时需要用回调方式执行,这样后面的语句不必等待demo1()执行完成才执行
//回调函数是异步执行的重要工具
$a=range(1,10);//range() 函数创建一个包含指定范围的元素的数组
//range(low,high,step):low必需。规定数组元素的最小值;high必需。规定数组元素的最大值;step可选。规定元素之间的步进制,默认是 1;
$b=range(1,10,2);
print_r($b);
echo '<hr>';
$arr=array_map(function($item){
if($item%2===0)return $item;//%:取模(除法的余数);该句表示能被2整除,也就是取偶数
},$a);
print_r($arr);//打印出来的存在键对应空值
echo '<hr>';
//array_filter() 函数用回调函数过滤数组中的元素
//$arr表示要过滤的数组,必需;function(){}表示要用的回调函数,可选;
$d=array_filter($arr,function($item){
return $item;
});
//可简写成$d=array_filter($arr);
print_r($d);
函数的命名空间
//函数的命名空间
namespace ns1;
function demo1(){
return __FUNCTION__;//__FUNCTION__:返回当前的函数名称字符串;
}
echo demo1(),'<br>';
//在php中不允许在同一个命名空间中声明同名函数,但js可以
namespace ns2;
function demo1(){
return __FUNCTION__;//__FUNCTION__:返回当前的函数名称字符串;
}
echo demo1(),'<hr>';
echo \ns1\demo1();//可以调用另一个空间中的函数
字符串的四种创建方式与应用场景
//字符串长度上限:2G
//创建方式:单引号、双引号、heredoc、nowdoc
//1、单引号
$a='abc';
//单引号中的变量不能被解析出来,但可以通过字符串与变量拼接来进行解析然后输出
echo 'This is a $a hello word.<br>';
echo 'This is a '.$a.' hello word.<br>';
//单引号中的特殊字符不能被解析,会原样输出
echo 'hello \n\r word.<br>';//\n\r表示回车换行
//单引号2层意义:1本义就是字符;2字符串的定界符
echo 'hello \'word\'.<br>';//单引号中又出现单引号,必须在单引号前面使用转义符:\
//如果又出现转义符:\,应该连续写2个才可以正常输出
echo 'hello \'word\\\'.<hr>';
//2、双引号
//双引号中的变量能被解析出来
echo "This is a $a hello word.<br>";
//双引号中的变量可以用{}包起来,表示这是一个变量
echo "This is a {$a}123 hello word.<br>";
echo "This is a ${a}123 hello word.<br>";//可以只用{}将标识符包起来
//双引号中的特殊字符能被解析
echo "hello \n\r\n\r\n\r word.<br>";//页面中无论写多少回车、换行解析出来只有一个空格
//双引号中又出现双引号,必须在双引号前面使用转义符:\
echo "hello \"word\".<hr>";
//3、heredoc,可以当作双引号的plus+
$a='abc';
echo "<p>Hello <b style=\"color:red;\">$a</b></p>";
//heredoc:可以解析变量,且双引号不需要转义,非常适合php+html写模板时使用
echo <<< asd
<p>Hello <b style="color:red;">$a</b></p>
asd;
//heredoc的起始标识符可以不用写双引号;起始标识符和结尾标识符必须一致
//4、nowdoc,可以当作单引号的plus+,适合大段的纯文本,不适合内嵌变量或特殊字符的文本
echo <<< 'asd'
Hello word.<br>Hello word.Hello word.<b>Hello word.</b>
asd;
//nowdoc的起始标识符必须添加单引号