博客列表 >PHP基础知识常量与变量、过滤器的认识与理解、

PHP基础知识常量与变量、过滤器的认识与理解、

῀℡῀ᵒᵐᵍᵎᵎᵎ
῀℡῀ᵒᵐᵍᵎᵎᵎ原创
2020年04月17日 15:49:29618浏览

变量

1. 作用域

  • 变量作用域,也叫”变量范围”, 即定义变量时的上下文环境
  • 变量作用域,通俗的说,就是变量的生效范围
  • 一个变量必定属于一个作用域, 这个作用域也包括了当前作用域中引入其它文件
  • 也有不受作用域限制的变量,例如超全局变量, 在程序中任何地方都是有定义的
  • 函数作用域: php 中只有函数可以创建作用域, 函数之外的代码全部在全局空间中
序号 作用域 描述
1 函数作用域 使用function关键字创建的作用域
2 全局作用域 函数之外的变量生效范围
  • php 中没有块作用域的概念, 这与其它编程语言不同, 请留意
  • 根据作用域不同, 变量可以分为三类:
序号 变量类型 描述
1 私有变量 函数中定义的变量
2 全局变量 函数之外定义的变量
3 超全局变量 也叫预定义变量,访问不受作用域限制
  • 超全局变量,也叫超全局数组,随系统加载,因此在所有脚本中均有定义,全局和函数中都可以访问
序号 变量名 描述
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. $setName = 'php中文网';
  5. //全局变量会自动注册也为超全局变量数组$GLOBAL的一个值
  6. //print_r($GLOBALS['setName']);
  7. //声明函数:同时也创建一个作用域
  8. function getInfo() : string{
  9. //定义一个函数“私有变量”
  10. //方法一:global
  11. //global $setName;
  12. //方法二:定义超全局变量
  13. $private = $GLOBALS['setName'];
  14. //函数中可以直接引用超全局变量
  15. echo $_SERVER['SCRIPT_NAME'].'<br>';
  16. return $private;
  17. }
  18. echo getInfo();
  19. echo $_SERVER['SCRIPT_NAME'].'<br>';

2. 静态变量

2.1 基本常识

  • 定义在函数中的静态变量使用static修饰,并且与函数作用域绑定
  • 静态变量定义时必须初始化,且只能初始化一次,默认为0
  • 当程序执行离开函数作用域后,静态变量的值不丢失
  • 静态变量的值,可以在函数的多次调用中保持不变,即可带入下次调用中
  • 函数中静态变量遵循私有变量约束, 全局不可访问

2.2 应用场景

  • 当多次调用同一函数,且要求每次调用之间共享或保留某些变量的时候
  • 尽管全局变量也可以办到,但没必要, 采用局部静态变量更合适

2.3代码演示

  1. <?php
  2. # 静态变量
  3. namespace one;
  4. function test(): float
  5. {
  6. // 私有变量,也叫动态变量,在函数中每一次都会自动初始化
  7. // 并且无法在多次调用过程中保持不变
  8. $sum = 0;
  9. $sum = $sum + 1;
  10. return $sum;
  11. }
  12. echo test(), '<br>';
  13. echo test(), '<br>';
  14. echo test(), '<br>';
  15. echo '<hr>';
  16. // 命名空间
  17. // 不同的目录下面可以有相同的文件名
  18. namespace ns2;
  19. // 全局变量
  20. $sum = 0;
  21. function test(): float
  22. {
  23. global $sum;
  24. $sum = $sum + 1;
  25. return $sum;
  26. }
  27. echo test(), '<br>';
  28. echo test(), '<br>';
  29. echo test(), '<br>';
  30. echo '<hr>';
  31. namespace two;
  32. function test(): float
  33. {
  34. // 局部静态变量: 只在函数第一次调用的时候被初始化,以后不会再被更新了
  35. // 静态变量,可以理解为在函数中的"伪全局变量"
  36. // 实现函数在多次调用的过程中共享数据
  37. static $sum = 0;
  38. $sum = $sum + 1;
  39. return $sum;
  40. }
  41. echo test(), '<br>';
  42. echo test(), '<br>';
  43. echo test(), '<br>';
  44. echo '<hr>';
  45. $num1 = 20;
  46. // 变量的本质是数据共享
  47. // 函数的本质是代码共享
  48. echo $num1 + 40;
  49. echo '<br>';
  50. echo $num1 + 20;
  51. echo '<br>';
  52. echo $num1 + 90;

3.超全局变量

  • 超全局变量有哪些
    • $GLOBALS :储存全局作用域中的变量
    • $_SERVER :获取服务器相关信息
    • $_REQUEST :获取POST和GET请求的参数
    • $_POST : 获取表单的POST请求参数
    • $_GET: 获取表单的GET请求参数
    • $_FILES :获取上传文件的的变量
    • $_ENV : 获取服务器端环境变量的数组
    • $_COOKIE:获取浏览器的cookie
    • $_SESSION : 获取session

变量过滤器

  • PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入

1.变量过滤器:

全部变量过滤器:

int => 257
boolean => 258
float => 259
validate_regexp => 272
validate_domain => 277
validate_url => 273
validate_email => 274
validate_ip => 275
validate_mac => 276
string => 513
stripped => 513
encoded => 514
special_chars => 515
full_special_chars => 522
unsafe_raw => 516
email => 517
url => 518
number_int => 519
number_float => 520
magic_quotes => 521
add_slashes => 523
callback => 1024

如需过滤变量,请使用下面的过滤器函数之一:

  • filter_var() - 通过一个指定的过滤器来过滤单一的变量
  • filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
  • filter_input - 获取一个输入变量,并对它进行过滤
  • filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤

代码演示

  1. <?php
  2. # 变量过滤器
  3. // foreach (filter_list() as $filter) {
  4. // echo $filter . ' => ' . filter_id($filter) . '<br>';
  5. // }
  6. // echo '<hr>';
  7. // 1. 过滤单个变量filter_var()
  8. // 年龄
  9. $age = 30;
  10. $age = '30';
  11. $age = 68;
  12. var_dump(filter_var($age, FILTER_VALIDATE_INT,['options'=>['min_range'=>18,'max_range'=>60]]));
  13. echo '<hr>';
  14. $email = 'admin@php.cn';
  15. $email = 'admin@';
  16. var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
  17. var_dump(filter_var($email, 274));
  18. echo '<hr>';
  19. // 2. 过滤单个变量filter_var_array()
  20. var_dump(filter_var_array([100, 'php'], FILTER_VALIDATE_INT));
  21. echo '<hr>';
  22. // 3. 检测是否存在指定的外部变量, filter_has_var()
  23. // 对于URL中的查询字符串: 在URL地址?后面的键值对
  24. // php.cn/index.php?
  25. // id=10
  26. // name=admin
  27. // INPUT_GET: 表示要检测的是$_GET,就是get参数,其实就是get请求
  28. // INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV
  29. var_dump(filter_has_var(INPUT_GET, 'page'));
  30. echo '<hr>';
  31. echo 'get变量p = ' . $_GET['p'];
  32. echo '<hr>';
  33. // 4. 访问外部变量的过滤器,filter_input
  34. var_dump(filter_input(INPUT_GET, 'p',FILTER_VALIDATE_INT, ['options'=>['min_range'=>1]]));
  35. // echo filter_input(INPUT_GET, 'p',FILTER_VALIDATE_INT, ['options'=>['min_range'=>1]]) ? '页码OK': '页码非法';
  36. // 5. 同时验证多个外部变量: filter_input_array()
  37. echo '<hr>';
  38. $args = [
  39. 'username' => FILTER_SANITIZE_STRING,
  40. 'email' => FILTER_VALIDATE_EMAIL,
  41. 'age' => ['filter' => FILTER_VALIDATE_INT, 'flags'=>FILTER_REQUIRE_SCALAR, 'options' => ['min_range' => 18]],
  42. 'blog' => FILTER_VALIDATE_URL,
  43. ];
  44. // 标量:单值变量, 字符串, 布尔, 数值,
  45. // 复合: 对象, 数组
  46. var_dump(filter_input_array(INPUT_GET, $args));

常量

1.常量的固有特征和常量的定义

  • define()函数有固定的值,不能让后面的程序代码修改他们的值了
  • define()函数和关键字const定义常量的区别是,前者是在全局空间中都会生效,而后者如果定义了命名空间,只有在命名空间下才会生效;

1.1代码演示

  1. /*
  2. 常量命名的要求和变量一样,但是约定俗成的规则(最好这样用):全大写
  3. 下面是定义一个名为π的常量
  4. */
  5. //常量也是超全局的
  6. define('PAI',3.1415926);
  7. // 常量是不用加$符的,加了就要出问题!
  8. echo PAI; //3.1415926

1.2代码演示

  1. <?php
  2. # 定义常量
  3. // define()函数
  4. define('LECTURE', '朱老师');
  5. // const 关键字
  6. const COURSE = 'PHP';
  7. // 常量不受作用域限制
  8. function test1()
  9. {
  10. echo LECTURE . '教: ' . COURSE . '<br>';
  11. define('SEX', '男');
  12. echo SEX . '<br>';
  13. // const不能用在函数中
  14. // const AGE = 30;
  15. // echo AGE;
  16. }
  17. test1();
  18. echo '<hr>';
  19. // 流程控制中,define能用, const不能用
  20. if (true) {
  21. define('EMAIL', 'admin@php.cn');
  22. // const EMAIL = 'admin@php.cn';
  23. // echo EMAIL;
  24. }
  25. // const用在类中,创建类常量
  26. class Demo
  27. {
  28. const HELLO = 'php.cn';
  29. // define('A', 100);
  30. }
  31. echo Demo::HELLO.'<br>';
  32. // echo Demo::A.'<br>';
  33. // 常量通常只允许用标量进行初始化
  34. // 标量: 单值变量, 字符串, 数值,布尔, null
  35. // php7.0+支持数组初始化常量
  36. const DB_LINKS = [
  37. 'host'=>'localhost',
  38. 'username'=>'root',
  39. 'password'=>'root',
  40. 'charset'=>'utf8',
  41. ];
  42. echo '<pre>'.print_r(DB_LINKS,true).'</pre>';
  43. // constant()
  44. echo constant('LECTURE'). '<br>';
  45. echo LECTURE. '<br>';
  46. $constantName = 'EMAIL';
  47. echo constant($constantName);
  48. echo '<hr>';
  49. define('USER_NAME', '其实我也是一个常量');
  50. define('', '其实我也是一个常量');
  51. echo '';
  52. echo constant('');

2.预定义常量

2.1 PHP可以用预定义常量来获取PHP中的信息。常用的预定义常量如下:

  • FILE 默认常量,是指PHP程序文件名及路径;
  • LINE 默认常量,是指PHP程序的行数;
  • CLASS: 类的名称;
  • METHOD: 类的方法名;
  • PHP_VERSION 内建常量,是指PHP程序的版本;
  • PHP_OS 内建常量,是指PHP解析器的操作系统的名称;
  • TRUE 是指真值(true);
  • FALSE 是指假指(false);
  • NULL 是指空值(null);
  • E_ERROR 是指最近的错误之处;
  • E_WARNING 是指最近的警告之处;
  • E_PARSE 是指解析语法有潜在的问题之处;
  • E_NOTICE 是指发生不同寻常的提示,但不一定是错误处;

注意:“FILE” “LINE ” “CLASS” “METHOD_” 中的“”是指两个下划线,不是指一个下划线。

3.魔术常量

  • 所谓的魔术常量就是PHP预定义的一些常量,这些常量会随着所在的位置而变化,也是预定义常量
  • LINE 获取文件中的当前行号
  • FILE 获取文件的完整路径和文件名
  • DIR 获取文件所在目录
  • FUNCTION 获取函数名称
  • CLASS 获取类的名称
  • METHOD 获取类的方法名
  • NAMESPACE 当前命名空间的名称(区分大小写)
  • TRAIT Trait 的名字

3.1代码演示

  1. <?php
  2. # 魔术常量
  3. echo '当前行号: ' . __LINE__ . '<br>';
  4. echo '当前文件: ' . __FILE__ . '<br>';
  5. echo '当前目录: ' . __DIR__ . '\demo6.php<br>';
  6. function hello123()
  7. {
  8. echo __FUNCTION__;
  9. }
  10. hello123();
  11. echo '<hr>';
  12. class D
  13. {
  14. public function index()
  15. {
  16. echo __METHOD__;
  17. }
  18. }
  19. (new D)->index();

课后总结

php学习有难记忆的,理解记忆还是容易很多

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