1.变量与常量的区别与创建,访问方式
变量与常量的区别
变量是临时存储数据的容器,是实现数据服用的手段。变量分为全局变量,私有变量,和超全局变量,除超全局变量外,其他变量受作用域限制。变量必须以$作为开始,变量名区分大小写
常量创建必须给定一个值,一旦被定义就无法再更改,通常用大写表示。常量不受作用域限制
变量与常量的创建
变量名必须以$作为开始,不允许使用特殊字符,数字作为变量的开始,必须使用字母或下划线开始,后面允许使用数字
常量的创建分为两种:关键字 const 创建,define() 函数创建,在类中,类的常量只能用 const 创建
//变量
$str='这是一个变量';
//常量,一旦定义就无法更改
constAPP_NAME='demo';
define('APP_ID',110);
classDemo{
constCLASS_NAME='Demo';
}
$name='APP_NAME';
变量与常量的访问方式
变量和常量都可以使用 echo 直接输出 echo 没有返回值,效率最高,常量的变量化,只能使用constant()函数来获取
//输出变量$a
echo $str;
echo'
';//换行
//访问常量
echo APP_NAME;
echo'
';
echo APP_ID;
echo'
';
//访问类中的常量
echoDemo::CLASS_NAME;
// 常量名的变量化,只能使用函数来获取
echo constant($name);
代码执行结果如下:
2.变量过滤器的常用函数与用法
变量过滤器的常用函数主要有:
filter_list()用来获取过滤器名称
filter_id()用来获取过滤器 ID,参数是过滤器名称
fliter_var() filter_var_array()分别用来过滤单个和多个变量
filter_has_var()用于检测是否存在某个外部变量
filter_input() filter_input_array()分别用于过滤单个和多个外部变量
外部变量类型: INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV
过滤器主要分为两大类: 验证过滤器,清理过滤器
验证过滤器:主要用于数据类型和格式的验证
清理过滤器:主要用于去掉非法字符,保留指定字符
//1.返回过滤器的名称
echo'
';
echo'
';
print_r(filter_list());
//2.返回过滤器的ID filter_id(过滤器的名称)
echo'
';
var_dump(filter_id('validate_email'));
echo"
";
var_dump(filter_id('int'));
echo'
';// 3.过滤单个变量 filter_var()
echo'
';
// 在验证范围内的变量
$num1=88;
// 在验证范围外的变量
$num2=101;
$option=['options'=>['min_range'=>1,'max_range'=>100]];
var_dump(filter_var($num1,FILTER_VALIDATE_INT,$option));
echo"
";
var_dump(filter_var($num2,FILTER_VALIDATE_INT,$option));
echo'
';
//4.过滤多个变量
//不符合验证规则变量
$var1=100;
$var2='abc';
//符合验证规则变量
$var3=666;
$var4=888;
//验证不通过将返回false
var_dump(filter_var_array([$var1,$var2],FILTER_VALIDATE_INT));
echo"
";
var_dump(filter_var_array([$var3,$var4],FILTER_VALIDATE_INT));
echo"
";
//5.检查是否存在指定变量filter_has_var()
//http://edu.std.com/demo2.php?var1=test
//当前请求只有一个参数
var_dump(filter_has_var(INPUT_GET,'var1'));//返回true
echo"
";
var_dump(filter_has_var(INPUT_GET,'var2'));//返回false
// 6.验证过滤外部变量filter_input()
//http://edu.std.com/demo3.php?name=%3Cspan%3Etest%3C/span%3E
//FILTER_SANITIZE_STRING 清理过滤器
var_dump(filter_input(INPUT_GET,'name',FILTER_SANITIZE_STRING));
echo'
';
//7.批量验证过滤外部变量filter_input_array()
$args=[
'name'=>FILTER_SANITIZE_STRING,//清理过滤器,清理字符串中的非法字符
'age'=>['filter'=>FILTER_VALIDATE_INT,'options'=>['min_range'=>18,'max_range'=>60]],
'email'=>FILTER_VALIDATE_EMAIL,//验证过滤器,验证邮箱格式
'is_married'=>FILTER_VALIDATE_BOOLEAN,//验证过滤器,验证布尔值
'test_url'=>FILTER_VALIDATE_URL//验证过滤器,验证URL格式
];
echo"
";
//http://edu.std.com/demo3.php?name=%3Cspan%3Edemo%3C/span%3E&age=200&email=1451535153qq.cpm&is_married=%E6%98%AF&test_url=edu.std.com/demo3.php
//非合法数据传值
var_dump(filter_input_array(INPUT_GET,$args));
/*array(5) {
["name"]=>
string(4) "demo"
["age"]=>
bool(false)
["email"]=>
bool(false)
["is_married"]=>
bool(false)
["test_url"]=>
bool(false)
}*/
//http://edu.std.com/demo3.php?name=demo&age=20&email=1451535153@qq.cpm&is_married=1&test_url=http://edu.std.com/demo3.php
var_dump(filter_input_array(INPUT_GET,$args));
/*
array(5) {
["name"]=>
string(4) "demo"
["age"]=>
int(20)
["email"]=>
string(17) "1451535153@qq.cpm"
["is_married"]=>
bool(true)
["test_url"]=>
string(28) "http://edu.std.com/demo3.php"
}
*/
代码执行结果:
3.函数的类型
内置函数:系统给用户提前写好的,可以开箱即用,不需要也不允许再申明
自定义函数:用户根据项目需求自己写的
可变函数:将函数名称放在一个变量中进行引用
匿名函数:没有函数名称,匿名函数也被叫做闭包
//1.系统函数/内置函数
var_dump(111);//用于打印数据,并输出数据类型
echo'
';
//2.自定义函数
functiongetStr(float$money,float$discount){
$pay=$money*$discount;
$str='原价:'.$money.' 元,实际支付 '.$pay.' 元
';
return$str;
}
echo getStr(1000,0.8);
echo'
';
// 3.可变函数:将函数名称放在一个变量中进行引用
$funcName='getStr';
echo $funcName(5000,0.6);
echo'
';
// 4. 匿名函数
$getStr=function(float$money,float$discount){
$pay=$money*$discount;
$str='原价:'.$money.' 元,实际支付 '.$pay.' 元
';
return$str;
};//匿名函数不是代码块需要加分号结束
echo $getStr(4000,0.8);
echo'
';
// 闭包函数,可以访问上一级空间的成员
$discount=0.6;
// 访问上一层空间的$discount
$str=function(float$money)use($discount){
$pay=$money*$discount;
return'原价:'.$money.' 元,实际支付 '.$pay.' 元
';
};
echo $str(10000);
echo'
';
$srting=function($discount){
// 使用上一层的$discount
// 子函数全局不可见,只有父函数可见
returnfunction(float$money,int$num)use($discount){
$p=$money*$num;
$pay=$p*$discount;
return'原价:'.$p.' 元,实际支付 '.$pay.' 元
';
};
};
$pay=$srting(0.8);
echo $pay(500,8);//通过父函数访问子函数
echo $srting(0.8)(500,8);
代码执行结果如下:
4.函数的返回值方式
函数必定有返回值,函数只支持单值返回,可以以下方式实现多值返回:
通过字符串拼接返回多值
通过数组返回
通过 json 字符串返回
通过将返回值序列化成字符串返回多值
// 1.通过自负窜拼接返回多值
functionres1(){
$status=0;
$msg='success';
return$status.' => '.$msg.'
';
}
echo res1();
echo'
';
// 2.通过数组的方式返回多值
functionres2(){
$status=0;
$msg='success';
$arr=['status'=>$status,'msg'=>$msg];
$str=implode(" => ",$arr);
return$str;
}
echo res2();
echo'
';
// 3.通过json格式化字符串返回多值
functionres3(){
$status=0;
$msg='success';
$arr=['status'=>$status,'msg'=>$msg];
returnjson_encode($arr);
}
echo res3();
echo'
';
// 4.通过将返回值序列化返回多值
functionres4(){
$status=0;
$msg='success';
$arr=['status'=>$status,'msg'=>$msg];
returnserialize($arr);
}
echo res4();
代码执行结果如下:
5.函数的参数
函数的参数主要分为 4 种:值传递参数,引用参数,默认参数,剩余参数
//函数的参数
// 1.值参数:值传递参数(默认方式)
functiondemo1(int$argc){
// 函数中对参数的操作不影响外部参数的值
return$argc+=10000;
}
echo demo1(100),'
';
echo'
';
// 2.应用参数,在参数前添加地址符 : &
functiondemo2(int&$argc){
// 函数中对参数的操作会改变外部参数的值
return$argc+=10000;
}
$var=100;
echo demo2($var),'
';
echo $var,'
';//10100
echo'
';
// 3.默认参数
functiondemo3(int$argc,int$num=1000){
return$argc+=$num;
}
$var=100;
echo demo3($var),'
';//第二个参数不传值,默认使用默认参数1000
echo demo3($var,3000);
echo'
';
//4.剩余参数 ...rest /...spread
//...$args 将传入的参数全部放入到一个素组$args中
functiondemo4(...$args){
// 计算数组值的和
returnarray_sum($args);
}
// 传入值是多个参数
echo demo4(2,3,4,5,6),'
';
functiondemo5(...$args){
returnarray_sum($args);
}
$data=[2,3,4,5,6];
// ...spread 将数组参数打散
echo demo5(...$data);
代码执行结果如下:
6.函数的回调执行方式
回调函数是异步执行的重要工具,用call_user_func() 和call_user_func_array() 来回调函数
// 回调函数
functiondemo1(...$args){
returnarray_sum($args);
}
functiondemo2(){
sleep(5);
return'5s later
';
}
// 以回调的方式来执行一个函数
echo call_user_func('demo1',2,3,4,5,6);
echo'
';
echo call_user_func_array('demo1',[2,3,4,5,6]);
echo'
';
echo call_user_func('demo2');//demo2 执行长时间过程,不影响后续代码的执行
echo'sleep 5';
echo'
';
$data=range(1,50);
// 将数组的值 *2 处理
$arr=array_map(function($item){
return$item*=2;
},$data);
print_r($arr);
代码执行结果如下:
7.函数的命名空间
php 中不允许在同一个命名空间中声明同名函数
//命名空间
namespacens1;
functiondemo1(){
return'命名空间 '.__NAMESPACE__.' 的方法 '.__FUNCTION__;
}
echo demo1();
echo'
';
namespacens2;
functiondemo1(){
return'命名空间 '.__NAMESPACE__.' 的方法 '.__FUNCTION__;
}
echo demo1();
echo'
';
// 在ns2中调用ns1中的demo1()
echo \ns1\demo1();
代码执行结果如下:
8.字符串的四种创建方式与应用场景数
字符串创建的方式有四种:单引号,双引号,heredoc,nowdoc;
单引号:单引号中的特殊字符,变量不能被解析,变量只能通过与字符串组合后输出,如果单引号中又出现单引号,必须使用转义符进行转义
双引号: 可以解析特殊字符和变量,多个空格或者回车在页面中被视为 1 个,如果双引号中出现双引号,必须使用转义符进行转义
heredoc: 双引号的升级本,可以解析变量,且双引号不需要被转义,使用于写 php+html 模版
nowdoc: 单引号的升级版,适合大段的存文本,不适合内嵌变量和特殊字符的文本
// 1.单引号 ''
$str='string';
// 单引号中变量不能被解析
echo'This is a $str demo.
';
// 通过和变量拼接来解析变量
echo'This is a '.$str.' demo.
';
//特殊字符 \r\n原样输出,不能被解析
echo'This is \r\n a demo.
';
// 单引号中出现单引号,必须使用 \ 转义
echo'This is a \'sting\' demo.
';
//输出一个\
echo'This is a \\ demo';
echo'
';
// 2.双引号 ""
// 双引号中变量被解析
echo"This is a {$str} demo.
";
// 双引号的特殊字符能被解析
echo"This is a \r\n demo.
";
// 双引号中出现双引号,必须使用 \ 转义
echo"This is a \"string\" demo.
";
echo'
';
// 3.heredoc
$username='username';
//可以解析变量,且双引号不需要转义,适用于写html模版
echo<<
用户登录
用户名:
密码:
登录
EOF;
echo'
';
// 4.nowdoc
// nowdoc 的起始标签必须加单引号
echo<<
Thisisalong{$str}
Thisisa \r\n
Thisisalongstring
Thisisalongstring
EOF;
// nowdoc不解析变量,适合写大段文本
代码执行结果如下: