全面了解变量,常量,函数与初步认识字符串的创建与应用场景
程序员文章站
2022-04-06 07:50:34
...
变量与常量的访问方式,创建,区别
变量与常量共同的访问方式 可以使用echo,print,print_r,var_dump,var_export
-
echo
: 回显, 无返回值 -
print($var)
: 打印变量, 与echo功能类似 , 但是会有返回值: 1 -
print_r($var, false|true)
: 以更容易理解的方式打印变量(readily易于理解) -
var_export($var, false|true)
: 输出/返回变量的字符串表示 -
var_dump($var1, $var2...)
: 打印一个或多个变量的结构,包括类型与值
变量创建
变量命名:$符号开头,字母+数字+下划线组合,$后第一个字符不允许是数字,命名区分大小写,字母最好是带语义的单词
举例:$check_email, $checkEmail, $checkShop1, $checkShop2
创建方式
- 1.直接创建不赋值 其实也算赋值,等同于$string1 = null;
$string1;
var_dump($string1); //打印是null值
- 2.可变变量创建
$var = 'email';
$$var = 'tlilam@163.com';
print($email); //使用$$var将后面的$var转为它的值email 就变成$email
- 3.创建基本类型
// 字符串
$name = '平板';
// 数值
$price = 6000;
// 布尔
$is5G = true;
- 4.创建复合模式
// 一维数组
$array = ['手机',4900,false];
var_dump($array);
// 二维数组或多维数组
$array2 = ['电脑',[8888,true]];
var_dump($array2);
- 5.特殊类型
// null类型
// 上面创建的$string1就是null特殊类型
$n = null;
// 资源类型
$f = fopen('demo1.php','rw');
- 6.私有变量 在函数内的变量是私有变量
$functionName = 'tlilam1';
function test2(){
$functionName = 'tlilam2'; //在函数内的变量与外部不互通
return $functionName;
}
- 7.全局变量 在函数以外都是全局变量,函数内想要使用全局变量需加入global声明
$functionName2 = 'tlilam';
function test3(){
//函数内没有创建$functionName2 声明后能得到全局变量的内容
global $functionName2;
return $functionName2;
}
echo test3();
// global声明过后也可以使用超全局变量$GLOBALS['变量名']进行访问
echo $GLOBALS['functionName2'];
常量的创建
常量命名:不需要$开头也不允许,也使用字母+数字+下划线组合,常量同样区分大小写,但推荐使用全大写命名
-
1.const创建
const APP_PATH = '/phpstudy_pro';
-
2.define创建
define('APP_NAME','管理系统');
- 3.在class内不能使用define创建常量,只能使用const创建常量
class classname
{
const GUOJIA = 'China';
}
常量另外的访问方式
// constant访问常量
echo constant('APP_NAME');
echo '<hr>';
echo APP_NAME;
echo '<hr>';
$name = 'APP_NAME';
// 常量名的变量化,只能使用函数来获取
echo constant( $name );
echo '<hr>';
// 特别注意常量名为'' 不是没有,只不过是一个空字符串
define('', 'admin@qq.com');
echo constant('');
变量过滤器的常用函数与用法
- 1.过滤单个变量:filter_var()
// 验证数值
$age = 44;
$options = ['options'=>['min_range'=>18,'max_range'=>60]];
// 使用filter_var函数,参数1被验证的变量, 参数2过滤器名称FILTER_VALIDATE_INT, 参数3过滤器的参数
var_dump( filter_var($age,FILTER_VALIDATE_INT,$options) );
echo '<br>';
// 验证邮箱
$email = 'tlilam@163.com';
var_dump( filter_var($email,FILTER_VALIDATE_EMAIL));
echo '<hr>';
- 2.过滤多个变量: filter_var_array()
// 验证多个变量类型是否同一个类型可以这么写
$age = 34;
$email = '123';
var_dump(filter_var_array([$age,$email],FILTER_VALIDATE_INT) );
echo '<br>';
// 验证多个变量对应不同类型
$arr = array(
'name' =>'tlilam',
'age' =>'44',
'email' =>'tlilam@163.com',
// 'float' =>'100',
'float' =>19.97,
// 'bool' =>'true',
'bool' =>true,
'ip' =>'255.168.1.1',
// 'ip' =>'555.168.1.1'
);
$filters = array(
'name' => FILTER_SANITIZE_STRING,
"age" => array(
"filter"=>FILTER_VALIDATE_INT,
"options"=>array
(
"min_range"=>20,
"max_range"=>100
)
),
'email' =>FILTER_VALIDATE_EMAIL,
'float' =>FILTER_VALIDATE_FLOAT,
'bool' =>FILTER_VALIDATE_BOOLEAN,
'ip' =>FILTER_VALIDATE_IP
);
// 将变量和验证条件都放在数值中,使用下标名字对应起来
var_dump( filter_var_array($arr,$filters) );
echo '<hr>';
- 3.验证外部变量 不在当前脚本创建的变量,外部GET,POST等方式传入
// 验证单个外部变量
// 函数结构 filter_input( 输入类型get/post, 字符串的变量名,过滤器,过滤器参数 )
$options = ['options'=>['max_range'=>60]];
var_dump( filter_input(INPUT_GET,'id',FILTER_VALIDATE_INT,$options) );
echo '<br>';
- 4.验证多个外部变量
//创建过滤器数组
$arr = [
'name' =>FILTER_SANITIZE_STRING,
'email'=>FILTER_VALIDATE_EMAIL,
'age' =>['filter'=>FILTER_VALIDATE_INT,'options'=>['min_range'=>20,'max_range'=>60]],
'url' =>FILTER_VALIDATE_URL
];
// 测试地址:http://php.edu/0815/test2.php?name=tlilam&email=tlilam@163.com&age=20&url=http://www.tlilam.cn&dd=20
// 只会验证变量名相同的数据,不存在的不会验证输出
var_dump( filter_input_array(INPUT_GET,$arr) );
- 5.filter_has_var() 函数检查是否存在指定输入类型(input_get/post)的变量。
if(filter_has_var(INPUT_GET, "name")){
echo'name 存在';
}else{
echo'name 不存在';
}
外部变量类型:
INPUT_GET
,INPUT_POST
,INPUT_COOKIE
,INPUT_SERVER
,INPUT_ENV
过滤器主要分为二类: 验证过滤器, 清理过滤器
- 6.filter_list() 函数返回包含所有得到支持的过滤器的一个数组。
// 得到过滤器的名字
print_r(filter_list());
- 7.filter_id() 规定被获取 ID 号的过滤器
// 使用filter_list得到名字,再使用filter_id得到过滤器ID 上面的过滤器FILTER_VALIDATE_EMAIL可以使用他们的ID代替
echo(filter_id("email"));
函数的类型,返回值,参数,回调执行,命名空间
函数语法
function 函数名(参数类型 参数,参数类型 参数='默认值'...) : 返回值类型
{
// 一条或多条的语句
return 返回值;
}
//函数调用
函数名(参数1,参数2...)
函数的类型
- 1.系统函数 系统内置的函数,直接调用函数名
// 系统内置的总和函数,我们自己并没有定义这样一个函数,是系统预定义好的
echo array_sum([5,5.5,7,8.5]);
- 2.自定义函数
自己定义一个总计函数,自己创建一个系统没有的函数就是自定义函数
$arr = [7,8,9,10,1];
function sum($arr){
foreach($arr as $value){
$a +=$value;
}
return $a;
}
echo sum($arr);
- 3.可变函数 通过变量名(),变动性调用不同的函数
function test(){
echo 'test';
}
function test2(){
echo 'test2';
}
$a = 'test';
echo $a();
echo '<hr/>';
$a = 'test2';
echo $a();
- 4.匿名函数 ,上面的是命名函数 就是有函数名和没函数名的区别
//因为没有函数名,无法直接使用函数名调用,需赋值的方式给变量,然后使用变量()调用
$getPrice = function (float $money, float $discount) : float {
return $money * $discount;
};
echo '实付金额: ' , $getPrice(2000, 0.6), ' 元<hr>';
- 5.闭包函数
// 匿名函数在php中也称之为闭包,闭包也是一个函数,可以访问上一级空间的成员
// 将折扣率变量声明到它的全局空间,是它的父作用域
$discount = 0.8;
// use () 这里使用的全局变量就是函数外的变量
$p = function (float $money) use ($discount) : float {
return $money * $discount;
};
echo '实付金额: ' , $p(10000), ' 元<hr>';
// 闭包更多是指子函数
$f = function ($discount) {
// 返回一个子函数
return function (float $money, int $n) use ($discount) : float {
$total = $money * $n;
return $total * $discount;
};
};
echo '实付金额: ' , $f(0.6)(10000, 2) , ' 元<hr>';
//上面的$f(0.6)(10000,2)等同于下面
// $p = $f(0.6);
// $p 是闭包函数的引用
// echo '实付金额: ' , $p(10000, 2) , ' 元<hr>';
// 闭包是匿名函数最常用的应用场景之一
// 闭包是一个子函数,全局不可见,但是它的父函数可见
// 闭包全局无法调用,可以当成父函数的返回值返回到全局,它可以将函数中的一些内容带给全局使用
// 因为函数一旦调用完成,内部全部释放掉, 外部不再能访问,外部不能访问函数中的私有成员
// 那么函数中的私有成员 , 可以通过它的子函数(闭包)返回到全局供它使用
函数的返回值
- 1.函数一定有返回值,即使你没写返回值,也会返回一个null
function null(){
$a = 1;
$b = 2;
$c = $a+$b;
}
var_dump(null());
- 2.返回值是一个整体,一串字符串,一个数组,一个对象
// 返回字符串
function string():string{
$str = '我是字符串';
return 'string'.$str.'<br/>';
}
echo string();
// 返回数组
function arr(){
$arr = [1,2,3,4,5,6];
return $arr;
}
var_dump(arr());
// 返回json格式字符串
function jsonStr(){
$arr = [1,3,5,7,9];
return json_encode($arr);
}
echo jsonStr();
// 返回序列化字符串
function serializeStr():string{
$string = 'abcdef';
$arr = [2,4,6,8];
return serialize( ['string'=>$string,'array'=>$arr ] );
}
echo serializeStr();
函数的参数
- 1.值参数 函数内变量参数的值与外部无关
function test1(int $var) :int{
return $var *=4;
}
$var = 20;
echo test1($var).'<br/>';
echo $var;
- 2.引用参数 &变量
$var = 20;
// 使用&引用外部参数,函数内变量发生改变,全局变量也改变
function test2(int &$var) :int{
return $var *=4;
}
echo test2($var).'<br/>';
echo $var;
- 3.默认参数 参数赋默认值 ,外部没有传入参数值就使用函数内的赋值
function test3(int $var = 100):int{
return $var *= 4;
}
echo test3().'<br/>';
- 4.剩余参数 …rest(归纳) …spread展开
// ...rest在自定义函数内的参数使用,调用传入的多个参数全部会归纳进$arr成为数组
function test(...$arr){
return $arr[0]*$arr[1];
}
echo test(10,20);
echo '<hr/>';
// ...spread在调用函数时传入的参数是一个数组可以使用这个展开
function test2($a,$b){
return $a*$b;
}
$arr = [20,30];
// ...$arr会展开成一位位的对应函数里面的参数
echo test2(...$arr);
echo '<hr/>';
// 个人认为会很少一起用的,平时应该分开使用,...spread展开整体, ...rest归纳合并成整体
// ...rest 与...spread 混合使用
// ...rest 多个参数全部会归纳进$arr成为数组
function test1(...$arr)
{
// print_r($arr);
return array_sum($arr);
}
$data = [10,20,30,40,50];
// ...spread用在调用函数的参数中,用在有具体值的参数列表,实参
echo test1(...$data), '<hr/>';
//同时使用效果是没变化,传一个数组参数被分散,在函数内又进行合并成数组,和直接传入一个数组无差
函数的回调执行方式
- 正常调用函数的流程是需要等待函数处理完毕后继续输出后面的内容
- 回调函数则用回调方式执行,不必等待函数完成就输出后面的内容
function test1($a,$b,$c){
return $a + $b + $c;
}
// 直接调用(同步调用:这条调用语句不执行完成, 后面语句不会被执行)
echo test1(1,2,3), '<hr/>';
// 以回调的方式来执行一个函数
// 1. call_user_func($callback,参数1,参数2,…)的参数个数根据回调函数的参数来确定的。
echo call_user_func('test1', 1,3,5);
echo '<hr>';
// 2. call_user_func_array是以数组的形式接收回调函数的参数
echo call_user_func_array('test1', [2,4,6]);
// 回调函数是异步执行的重要工具
$arr = array(
['age' =>20,'sex' => '男'],
['age' =>21,'sex' => '女'],
['age' =>22,'sex' => '男'],
['age' =>23,'sex' => '女'],
);
function test($v)
{
if($v['sex'] == '男'){
$v['age'] +=2;
}
return $v;
}
print_r(array_map("test",$arr));
函数的命名空间
- 一个php文件默认是在同一个全局空间
- 在php中不允许在同一个命名空间中声明同名函数,如需创建需要进行不同的命名空间定义
// __NAMESPACE__: 返回当前的函数名称字符串
// __FUNCTION__: 返回当前的函数名称字符串
// 命名空间space1
namespace space1;
function test()
{
return '命名空间:'.__NAMESPACE__.',函数名:'.__FUNCTION__;
}
echo test();
echo '<hr>';
// 命名空间space2
namespace space2;
function test()
{
return '命名空间:'.__NAMESPACE__.',函数名:'.__FUNCTION__;
}
echo test();
echo '<hr>';
// 调用另一个空间的函数 反斜杆加 命名空间 反斜杆 函数名 \space1\test();
echo \space1\test();
字符串的四种创建方式与应用场景
注意:字符串长度上限2G
使用转义符\ 输出单引号或双引号,和转义符自身 - 1.单引号 应用于单纯的字符串内容输出
// 单引号不解析变量,特殊字符等特殊含义的字符,如需输出单引号' 或转义符\ 在前面添加转义符\ 进行转义
$string = 'string';
echo '$string This is a \'test\'. <br> ';
echo '<hr/>';
- 2.nowdoc单引号加强版 应用于含有大量单引号或转义符内容的字符串输出
// 当内容含有多个单引号之类 使用转义符会很累,也可能会漏加就使用nowdoc
// 前面的定义字符一定需要单引号引起
$a = <<< 'abc'
This is 'test'<br>
This is 'test'<br>
This is 'test'<br>
This is 'test'<br>
abc;
echo $a;
echo '<hr/>';
- 3.双引号 应用于输出字符串混合有变量,特殊字符需要解析的内容
// 双引号会解析变量,特殊字符
echo "This is a $str \n\r hello word. <br>";
// 推荐在双引号内的变量使用大括号包起来,如需输出双引号和转义符使用转义符\进行转义
echo "This is a \n\r {$str}123 \" hello \" word.\\ <br>";
echo '<hr/>';
- 4.heredoc 双引号加强版 应用于php+html写模板,大量双引号,转义符,变量内容等
// 同样内容有很多双引号的时候使用双引号输出会很麻烦需要很多转义符
// 前面的定义字符可以用双引号引起也可以不用
$b = <<< HELLO
<p>Hello <span style="color:red">$hello</span></p>
<p>Hello <span style="color:blue">$hello</span></p>
HELLO;
echo $b;