博客列表 >PHP - 初识PHP及变量

PHP - 初识PHP及变量

晴天
晴天原创
2020年04月17日 19:47:48509浏览

php 变量

1.变量是什么

概念 描述
临时存储数据的空间 并不是所有的数据都要保存到文件中,对于只适用于当前程序的数据用变量更合适
数据的复用手段 将程序需要反复调用的数据,保存到一个变量中实现数据的复用

2.命名规范

规则 描述
语法 $+标识符(必须以\$作为变量标志)
标识符 只允许使用大小写字母、数字、下划线,且不允许以数字开头
大小写敏感 严格区分大小写$name$NAME是两个不同的变量
无意义变量名 $_ $aaa $_123,有效但无意义

变量名要做到望名生义,一个有意义的变量名,可以极大地提高代码可读性,以及后期维护方便

推荐一个变量命名网站,告别命名恐惧症:[https://unbug.github.io/codelf/]

3. 创建方式

php 是动态语言,所以他的类型,值,变量名都是动态的

名称 描述
弱类型 变量的类型由他当前值决定
变量传递 变量的值来自另一个变量时,存在“值传递和引用传递两种”
动态变量名 也叫“可变变量”,即变量标识符来自另一个变量的值

3.1 弱类型

  • php 是弱类型语言,他的变量类型由赋给他的值决定

  • 因此 php 变量不需要使用前进行声明

示例代码

  1. //声明一个变量
  2. $var = 123;
  3. #打印
  4. var_dump($var);
  5. #输出
  6. #int(100)
  7. #当前他的变量类型为 int类型
  8. $var = 'hello word';
  9. #打印
  10. var_dump($var);
  11. #输出
  12. #string(11)"hello word"
  13. #当前他的变量类型为 string类型

3.2 值传递与引用传递

将变量赋值给另一个变量时,有值传递和引用传递两种方式

传递方式 描述
值传递 将原变量的变量值复制到新变量中
引用传递 将原变量内存访问地址使用&引用 赋值给新变量

示例

  1. #1.值传递
  2. $price1 = 123;
  3. $price2 = $price1;
  4. //输出 结果
  5. echo $price1 ; //123
  6. echo $price2 ; //123
  7. #更新 $price1
  8. $price1 = 456 ;
  9. //输出 结果
  10. echo $price1; //456
  11. echo $price2; //123
  12. #2.引用传递
  13. $price3 = 789;
  14. $price4 = &$price3;
  15. //输出 结果
  16. echo $price3 ; //789
  17. echo $price4 ; //789
  18. #更新price3
  19. $price3 = 369;
  20. //输出 结果
  21. echo $price3; //369
  22. echo $price4; //369

引用传递就相当于给原变量起一个别名。

3.3 可变变量

  • 可变变量:是指变量的标志符可以动态的改变,即变量标识符可以来自另外一个变量的值

  • 应用场景: 需要通过动态改变变量来处理不同需求的时候,例如图像处理,请求处理时

演示代码

  1. #声明变量
  2. $var = 'email';
  3. $$var = 456;
  4. #输出 结果
  5. echo $emali; //456

4.检测与删除

函数 描述
isset() 检测变量是否存在且值非null
unset() 删除变量,销毁
empty() 是否为空(""/0/'0'/null/false/[]/\$a
isnull() NULL:赋值为null/未赋值/unset()

代码

  1. #打开报错开关
  2. error_reporting(E_ALL);
  3. #打印值 结果
  4. echo $username; //报错:变量未定义
  5. // 所以在打印之前应该进行检测
  6. if(isset($username)){ //检测变量是否存在且值非null
  7. echo $username; //如果存在,输出变量
  8. } else{
  9. echo '变量不存在'; //若不存在,输出不存在
  10. }
  11. //当前值不存在,输出为“变量不存在”
  12. #声明一个值
  13. $username = 123;
  14. //检测输出
  15. if(isset($username)){ //检测变量是否存在且值非null
  16. echo $username; //如果存在,输出变量
  17. } else{
  18. echo '变量不存在'; //若不存在,输出不存在
  19. }
  20. //当前值存在 输出 123
  21. #销毁该值
  22. unset($username);
  23. //检测输出
  24. if(isset($username)){ //检测变量是否存在且值非null(空)
  25. echo $username; //如果存在,输出变量
  26. } else{
  27. echo '变量不存在'; //若不存在,输出不存在
  28. }
  29. // 当前值已被销毁(不存在) , 输出 变量不存在
  30. # 检测当前值是否为空 empty()
  31. //声明一个空值
  32. $username ;
  33. /* 以下声明与上面检测结果相同
  34. $username = 0 ;
  35. $username = '0';
  36. $username = null;
  37. $username = false;
  38. $username = [];*/
  39. //检测输出
  40. if(empty($username)){ //检测是否为空
  41. echo '该值为空'; //若为空提示
  42. } else{
  43. echo $uesrname; //若不为空输出值
  44. }
  45. //当前值为空 输出 ’该值为空‘
  46. #声明值
  47. $username = 123;
  48. #再次检测
  49. if(empty($username)){ //检测是否为空
  50. echo '该值为空'; //若为空提示
  51. } else{
  52. echo $uesrname; //若不为空输出值
  53. }
  54. // 当前值不为空 输出 ’123‘
  55. #检测当前变量是否有值
  56. // 声明
  57. $username ;
  58. // 检测
  59. if(isnull($username)){ //检测是否存在值,
  60. echo '值不存在'; //不存在输出
  61. } else{
  62. echo '值存在' //存在输出
  63. }
  64. // 当前$username 没有值 输出 值不存在

5 数据类型

变量的访问方式,受以下条件限制

名称 描述
数据类型 主要有基本类型,复用类型和特殊类型
作用域 变量的有效范围,即可见性,查询变量的工具
生命周期 变量从注册到注销的全过程(程序结束会自动注销)
  • 确定了数据类型,才可以确定数据的’取值范围‘与’操作方式‘,所以非常重要

  • 变量的数据类型由值决定,值的数据类型有三类:基本类型,复合类型,特殊类型。

5.1 基本类型

基本类型是构成符合类型的基本数据单元

序号 类型 标识符 检测函数 举例
1 整数 integer is_int() 150,999
2 浮点型 float is_float() 3.14,.315
3 字符 string is_steing() ''php 'email'
4 布尔 boolean is_bool() true , false

5.2 复合类型

类型 标识符 检测函数 举例
对象 object is_object() new stdClass()
数组 array is_array() $arr = [1,2,3]

5.3 特殊类型

类型 标识符 检测函数 举例
null is_null() null
资源 rasource is_resource() $f = fopen(...)
  1. <?php
  2. # 变量类型
  3. // 基本类型
  4. $name = '手机';
  5. $price = 3890;
  6. $is5G = true;
  7. echo $name . '价格: ' . $price . ', 是否5G? ' . ($is5G ? '是' : '否') . '<br>';
  8. // 复合类型
  9. $obj = new stdClass;
  10. $obj->email = 'admin@php.cn';
  11. echo $obj->email, '<br>';
  12. $arr = ['电脑', 8000, 'huawei'];
  13. // print_r($arr);
  14. echo '<pre>' . print_r($arr, true) . '</pre>';
  15. // 特殊类型
  16. $num = null;
  17. var_dump($num);
  18. $f = fopen('demo6.php', 'r');
  19. var_dump($f);
  20. // gettype(): 返回类型字符串
  21. echo gettype($f);

5.4 类型查询

  • 类型检测函数,如is_int() 返回的都是一个布尔值

  • gettype():返回类型的字符串表示


6.类型转换

6.1 自动转换

  • 自动转换:表达式根据操作符,将操作数组转为一致的数据类型后再进行运算

  • 自动转换,通常只发生在基本类型 参与的算术或字符串运算中

类型 转换规则
null null => 0
boolean true => 1,false => 0
string 123abc => 123,abc123 => 0
integer int => float

6.2 强制转换

  • 强制转换分为:临时转换,永久转换

  • 临时转换,可使用类型提示符,或者类型函数实现

使用类型提示符:

类型 转换规则
(int) 转为整数
(float) 转为浮点数
(string) 转为字符串
(array) 转为数组
(object) 转为对象

使用类型函数:

类型 转换规则
intval() 转为整数
floatval() 转为浮点数
strval() 转为字符串
boolval() 转为布尔
  • 永久转换:使用函数settype($var , $type)

示例代码

  1. <?php
  2. # 变量类型转换
  3. // 自动转换
  4. $a = null;
  5. $b = true;
  6. $c = false;
  7. $d = '5g';
  8. $e = 'php';
  9. $f = 15;
  10. echo $a + 10, '<br>';
  11. echo $b + 10, '<br>';
  12. // 字符串转数值型会有警告,但代码仍会执行, 推荐使用强制转换
  13. echo $d + 10, '<br>';
  14. echo $e + 10, '<br>';
  15. // 整数15转为字符串'15'
  16. echo $e . $f;
  17. echo '<hr>';
  18. // 强制转换
  19. // 转换提示符: (int),(sgring)...
  20. // (int)将$d强制转为整数,不再有警告信息
  21. echo (int) $d + 10, '<br>';
  22. // intval()转整数
  23. echo intval($d) + 18, '<br>';
  24. // strval($f)转字符串
  25. echo strval($f) . ' hello', '<br>';
  26. // 以上通过提示符和函数完成的强制转换,并不改变变量原始类型
  27. // $f 依然是整数类型:integer
  28. echo gettype($f), '<br>';
  29. // settype()可将变量类型永久转换
  30. settype($f, 'string');
  31. // $f 永久的成为字符串类型
  32. echo gettype($f), '<br>';

7.作用域

  • 变量作用域,也叫变量范围,即定义变量是的上下文环境

  • 通俗的说就是变量的生效范围

  • 一个变量必定属于一个作用域,这个作用域也包括了当前作用域中引入的其他文件

  • 也有不受作用域限制的变量,例如超全局变量,在程序中的任何方都是有定义的

  • 函数作用域:php 中只有函数可以创建作用域,函数之外的代码全部在全局空间中

作用域 描述
函作用域 使用function关键字创建的作用域
全局作用域 函数之外的变量生效范围
  • php 中没有块作用域的的概念,这与其他编程语言不同

  • 根据作用域的不同,变量可以分为三类

变量类型 描述
私有变量 函数中定义的变量
全局变量 函数之外定义的变量
超全局变量 也叫预定义变量,访问不收受作用域的限制
  • 超全局变量,也叫超全局数组,随系统加载,因此在所有脚本中均有定义,全局和函数中都可以访问
序号 变量名 描述
1 $GLOBALS 引用全局作用域中可用的全部变量
2 $_SERVER 服务器和执行环境信息
3 $_GET HTTP GET 请求:通过 URL 参数传递给当前脚本的变量的数组
4 $_POST HTTP POST 请求:将变量以关联数组形式传入当前脚本
5 $_FILES HTTP 文件上传变量,保存着上传文件的全部信息
6 $_COOKIE 通过 HTTP cookies 方式传递给当前脚本的变量的数组
7 $_SESSION 当前脚本可用 SESSION 变量的数组
8 $_REQUEST 默认情况下包含了$_GET $_POST $_COOKIE 的数组
9 $_ENV 通过环境方式传递给当前脚本的变量的数组

示例代码

  1. <?php
  2. # 变量类型转换
  3. // 自动转换
  4. $a = null;
  5. $b = true;
  6. $c = false;
  7. $d = '5g';
  8. $e = 'php';
  9. $f = 15;
  10. echo $a + 10, '<br>';
  11. echo $b + 10, '<br>';
  12. // 字符串转数值型会有警告,但代码仍会执行, 推荐使用强制转换
  13. echo $d + 10, '<br>';
  14. echo $e + 10, '<br>';
  15. // 整数15转为字符串'15'
  16. echo $e . $f;
  17. echo '<hr>';
  18. // 强制转换
  19. // 转换提示符: (int),(sgring)...
  20. // (int)将$d强制转为整数,不再有警告信息
  21. echo (int) $d + 10, '<br>';
  22. // intval()转整数
  23. echo intval($d) + 18, '<br>';
  24. // strval($f)转字符串
  25. echo strval($f) . ' hello', '<br>';
  26. // 以上通过提示符和函数完成的强制转换,并不改变变量原始类型
  27. // $f 依然是整数类型:integer
  28. echo gettype($f), '<br>';
  29. // settype()可将变量类型永久转换
  30. settype($f, 'string');
  31. // $f 永久的成为字符串类型
  32. echo gettype($f), '<br>';

8.静态变量

8.1 基本常识

  • 定义在函数中的静态变量使用static修饰,并且与函数作用域绑定
  • 静态变量定义时必须初始化,且只能初始化一次,默认为 0

-当程序执行离开函数作用域后,静态变量的值不丢失

  • 静态变量的值,可以在函数中多次调用中保持不变,即可带入下次调用中

  • 函数中静态变量遵循私有变量约束,全局不可访问

8.2 应用场景

  • 当多次调用同一个函数,且要求每次调用之间共享或保留某些变量的时候

  • 尽管全局变量也可以做到,但没必要,采用局部静态变量更合适

代码

  1. # 静态变量
  2. namespace ns1;
  3. function test1(): float
  4. {
  5. // $sum: 局部动态变量,每次调用都会初始化,无法在多次调用中保持不变
  6. $sum = 0;
  7. $sum = $sum + 1;
  8. return $sum;
  9. }
  10. echo test1(), '<br>';
  11. echo test1(), '<br>';
  12. echo test1(), '<br>';
  13. echo '<hr>';
  14. namespace ns2;
  15. // 全局变量
  16. $sum = 0;
  17. function test1(): float
  18. {
  19. // 通过全局变量,将每次的调用结果保存到全局中
  20. global $sum;
  21. $sum = $sum + 1;
  22. return $sum;
  23. }
  24. echo test1(), '<br>';
  25. echo test1(), '<br>';
  26. echo test1(), '<br>';
  27. echo '<hr>';
  28. namespace ns3;
  29. function test1(): float
  30. {
  31. // 静态变量: 仅第一次调用时初始化,以后调用可保持原值
  32. // 静态变量: 可简单理解为仅在函数中使用的"伪全局变量"
  33. // 可以实现在函数的多次调用中的数据共享
  34. static $sum = 0;
  35. $sum = $sum + 1;
  36. return $sum;
  37. }
  38. echo test1(), '<br>';
  39. echo test1(), '<br>';
  40. echo test1(), '<br>';

9. 变量过滤器

  • PHP 过滤器用于验证和过滤来自非安全来源的外部数据

  • 外部数据来源:

数据来源 描述
表单 来自表单的用户输入数据
cookies 来自浏览器的 cookie
服务器变量 防止伪装的合法访问
web 服务数据 web 请求数据
数据库查询结果 数据表中的数据并不可信
  • 常用过滤器函数
函数 描述
filter_list()
filter_id()
filter_var() 过滤单个变量
filter_var_array() 过滤多个变量
filter_has_var() 检测是否存在某个外部变量
filter_input() 过滤单个外部变量
filter_input_array() 过滤多个外部变量
  • 外部变量类型:INPUT_GET INPUT_POST INPUT_COOKIE INPUT_SERVER INPUT_ENV

  • 过滤器主要分为两类: 验证过滤器 清理过滤器

9.1 验证过滤器常量

  • 验证过滤器:又叫“验证器”,主要用于数据的类型和格式验证
过滤器函数 描述
FILTER_VALIDATE_INT 验证整数
FILTER_VALIDATE_FLOAT 验证浮点
FILTER_VALIDATE_BOOLEAN 验证布尔项
FILTER_VALIDATE_EMAIL 验证邮箱
FILTER_VALIDATE_URL 验证 URL 地址
FILTER_VALIDATE_IP 验证 IP 地址
FILTER_VALIDATE_REGEXP 正则验证
  • FILTER_VALIDATE_BOOLEAN: 布尔选项的返回值类型
    | 序号 | 返回值 | 描述 |
    | —— | ———- | ——————————————- |
    | 1 | true | “1”, “true”, “on” 和 “yes” |
    | 2 | false | “0”, “false”, “off”, “no”, “” |
    | 3 | null | 除以上情形外 |

9.2 清理过滤器常量

  • 清理过滤器: 去掉非法字符,仅保留指定内容
序号 过滤器函数 描述
1 FILTER_UNSAFE_RAW 保持原始数据
2 FILTER CALLBACK 自定义函数过滤数据
3 FILTER_SANITIZE_STRING 去除标签以及特殊字符:strip_tags()
4 FILTER_SANITIZE_STRIPPED “string” 过滤器别名
5 FILTER_SANITIZE_ENCODED URL-encode 字符串,去除或编码特殊字符
6 FILTER_SANITIZE_SPECIAL_CHARS HTML 转义字符, 等价于 htmlspecialchars()
7 FILTER_SANITIZE_EMAIL 仅保留邮箱地址的合法字符
8 FILTER_SANITIZE_URL 仅保留合法的 URL, 必须从协议开始http/https
9 FILTER_SANITIZE_NUMBER_INT 仅保留合法的数字和正负号+-
10 FILTER_SANITIZE_NUMBER_FLOAT 仅保留合法的数字和正负号+- 以及指数 .,eE
11 FILTER_SANITIZE_MAGIC_QUOTES 等价于函数: addslashes()

9.3 选项与标志

  • 可以对过滤器设置选项和标志, 对数据进行更加精准的过滤处理
  • 选项与标志使用数组键名表示: 'options'=>[...], 'flags'=>...(复数)
  • 举例:
  1. filter_var($int, FILTER_VALIDATE_INT, ['options'=>['min_range'=>10,'max_range'=>80]]);
  2. // FILTER_REQUIRE_SCALAR: 必须是标量(即单值数据,如字符串,数值,布尔, 不能是数组或对象)
  3. filter_var($data, FILTER_VALIDATE_EMAIL, ['flags'=>FILTER_REQUIRE_SCALAR]);

示例代码: demo11.php

  1. # 变量过滤器
  2. // filter_list(): 查看支持的所有过滤器
  3. // filter_id(): 返回过滤器常量对应的ID
  4. foreach (filter_list() as $filter) {
  5. // echo $filter . ' => ' . filter_id($filter) . '<br>';
  6. }
  7. echo '<hr>';
  8. // 1. filter_var(): 过滤单个变量
  9. $age = 30;
  10. var_dump(filter_var($age, FILTER_VALIDATE_INT));
  11. // 验证时,会将变量值转为字符串类型, 所以这样写也对
  12. $age = '30';
  13. var_dump(filter_var($age, FILTER_VALIDATE_INT));
  14. echo '<br>';
  15. // 还可以添加第三个参数,对过滤器行为进行限定
  16. // 被过滤的数据也支持字面量,但不推荐这样
  17. var_dump(filter_var(10, FILTER_VALIDATE_INT, ['options' => ['min_range' => 18, 'max_range' => 60]]));
  18. $age = 40;
  19. var_dump(filter_var($age, FILTER_VALIDATE_INT, ['options' => ['min_range' => 18, 'max_range' => 60]]));
  20. echo '<br>';
  21. // 既可以使用过滤器常量,也可以使用过滤器ID
  22. $email = 'admin@php.cn';
  23. // 过滤器常量
  24. var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
  25. echo '<br>';
  26. // 过滤器ID
  27. var_dump(filter_var($email, 274));
  28. echo '<br>';
  29. var_dump(filter_var('peter@qq.com', 274));
  30. echo '<br>';
  31. // 2. filter_var_array():过滤多个变量
  32. $a = 10;
  33. $b = 'php';
  34. // 返回值是数组, 验证失败返回false,成功返回原值
  35. var_dump(filter_var_array([$a, $b], FILTER_VALIDATE_INT));
  36. echo '<br>';
  37. // 对于多变量验证最好将数组放在数组中统一处理
  38. $data = [$a, $b, 'html', [6, 7, 8], 150, 200];
  39. var_dump(filter_var_array($data, FILTER_VALIDATE_INT));
  40. // 过滤掉验证未通过的元素
  41. var_dump(array_filter(filter_var_array($data, FILTER_VALIDATE_INT)));
  42. echo '<hr>';
  43. // 3. filter_has_var(): 检测是否存在指定类型的外部变量
  44. // 变量类型仅限:INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV
  45. var_dump(filter_has_var(INPUT_GET, 'id'));
  46. echo '<br>';
  47. //4. filter_input(): 通过名称获取特定的外部变量,并且可以通过过滤器处理它
  48. // 变量类型仅限:INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV
  49. // false:验证失败, null: 变量不存在, 成功返回当前值
  50. // $_GET['id'] 必须是大于1的整数
  51. $res = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]);
  52. var_dump($res);
  53. echo '<hr>';
  54. // 5. filter_input_array(): 同时验证多个外部变量
  55. // 为一组数据应用统一过滤器
  56. var_dump(filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING));
  57. // 为每一个元素应用不同的过滤器
  58. // 设置变量对应过滤器
  59. $args = [
  60. 'username' => FILTER_SANITIZE_STRING,
  61. 'email' => FILTER_VALIDATE_EMAIL,
  62. 'age' => ['filter' => FILTER_VALIDATE_INT, 'flags'=>FILTER_REQUIRE_SCALAR, 'options' => ['min_range' => 18]],
  63. 'blog' => FILTER_VALIDATE_URL,
  64. ];
  65. // 非法: demo11.php?username=<a>admin</a>&email=abc&age=15&blog=blog.php.cn
  66. // 合法: demo11.php?username=admin&email=abc@qq.com&age=25&blog=http://blog.php.cn
  67. var_dump(filter_input_array(INPUT_GET, $args));

10 . 总结

未接触php之前,一直觉得php很难,接触之后发现也不是那么难,主要是要理解他的逻辑,但还是要保持敬畏之心。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议