博客列表 >变量过滤器以及常量的学习领悟

变量过滤器以及常量的学习领悟

我是郭富城
我是郭富城原创
2020年04月17日 03:39:06756浏览

变量与过滤器

1. 作用域

  • 变量作用域,也叫”变量范围”, 即定义变量时的上下文环境
  • 变量作用域,通俗的说,就是变量的生效范围
  • 一个变量必定属于一个作用域, 这个作用域也包括了当前作用域中引入其它文件
  • 也有不受作用域限制的变量,例如超全局变量, 在程序中任何地方都是有定义的
  • 函数作用域: php 中只有函数可以创建作用域, 函数之外的代码全部在全局空间中

    php 中没有块作用域的概念, 这与其它编程语言不同, 请留意

序号 作用域 描述
1 函数作用域 使用function关键字创建的作用域
2 全局作用域 函数之外的变量生效范围
  • 在函数中无法访问全局作用域的全局变量,无法获取赋值
  1. <?php
  2. # 变量作用域
  3. //全局作用域
  4. $siteName = '我爱php';
  5. //声明函数:相当于创建了一个函数作用域
  6. //返回一个字符串
  7. function getInfo(): string
  8. {
  9. //定义了一个函数私有变量(内部变量,局部变量)
  10. $private = $siteName;
  11. return $private;
  12. }
  13. echo getInfo();

如何获取到这个在函数外的全局变量赋值呢?这里有两种方法
方法一:告诉函数作用域,这里有一个变量是全局变量,global \$siteName;
方法二:使用超全局变量,全局变量默认就是超全局变量里面的子集,数学中叫做集合
超全局变量不需要声明,不需要赋值,不受作用域的限制


  1. <?php
  2. # 变量作用域
  3. //全局作用域
  4. $siteName = '我爱php';
  5. //声明函数:相当于创建了一个函数作用域
  6. //全局变量默认是超全局变量数组的一个值,在数学的角度就是一个集合
  7. // $GLOBALS(访问不受作用域限制)
  8. //返回一个字符串
  9. function getInfo(): string
  10. {
  11. //定义了一个函数私有变量(内部变量,局部变量)
  12. // 方法一:global
  13. // global $siteName;
  14. // 方法二:使用超全局变量
  15. // 函数可以直接访问超全局变量
  16. $private = $GLOBALS['siteName'];
  17. return $private;
  18. }
  19. echo getInfo();
  • 根据作用域不同, 变量可以分为三类:
序号 变量类型 描述
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 通过环境方式传递给当前脚本的变量的数组

2. 静态变量(用的比较多,实现数据共享)

2.1 基本常识

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

    函数中静态变量遵循私有变量约束, 全局不可访问
    全局变量默认是静态的
    使用静态变量,只在函数第一次调用的时候被初始化,可以一直保持值不变

2.2 应用场景

  • 当多次调用同一函数,且要求每次调用之间共享或保留某些变量的时候
  • 尽管全局变量也可以办到,但没必要, 采用局部静态变量更合适
  1. <?php
  2. #静态变量
  3. function test1(): float
  4. {
  5. //私有变量/局部变量
  6. //该变量属于动态变量,即该变量离开了函数就不能使用
  7. //每次都会自动初始化0
  8. //无法在多次调用中保持不变
  9. $sum = 0;
  10. $sum = $sum + 1;
  11. return $sum;
  12. }
  13. echo test1();
  14. echo test1();
  15. echo test1();
  1. function test1(): float
  2. {
  3. //全局中的变量默认是静态的
  4. //使用静态变量,只在函数第一次调用的时候被初始化,可以一直保持值不变
  5. static $sum = 0;
  6. $sum = $sum + 1;
  7. return $sum;
  8. }
  9. echo test1();
  10. echo test1();
  11. echo test1();

3.变量与函数的本质

  • 变量的本质是为了实现数据共享
  • 函数的本质是为了实现代码共享,其他地方需要用到直接调用函数名即可
  1. $num1 = 20;
  2. echo $num1 + 15;
  3. echo '<br>';
  4. echo $num1 + 55;
  5. echo '<br>';
  6. echo $num1 + 85;
  7. echo '<br>';
  8. echo $num1 + 105;

4. 变量过滤器

  • foreach()遍历数组
  • filter过滤器
  • 过滤单个变量filter_var()
  1. <?php
  2. $age = 30;
  3. // 变量过滤器限制不符合的东西
  4. $age = '300';
  5. // 验证过程中都是把字符转为字符串
  6. //1.过滤单个变量filter_var()
  7. var_dump(filter_var($age, FILTER_VALIDATE_INT, ['options' => ['min_range' => 18, 'max_range' => 60]]));
  8. echo '<hr>';
  9. $email = 'admin@php.cn';
  10. $email = 'admin@';
  11. var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
  • 过滤多个变量 filter_var_array()
  1. <?php
  2. //2.过滤多个变量filter_var_array()
  3. echo '<hr>';
  4. var_dump(filter_var_array([100, 'php'], FILTER_VALIDATE_INT));
  • 检测是否存在指定的外部变量 filter_has_var()
  1. // 对于URL中的查询字符串:在URL地址?后面的键值对
  2. echo '<hr>';
  3. echo $_GET['p'];
  4. echo '<br>';
  5. //INPUT_GET:表示要检测的是$_GET,就是get参数,其实就是get请求
  6. var_dump(filter_has_var(INPUT_GET, 'p'));
  7. echo '<br>';
  8. echo 'get变量' . $_GET['p'];
  • 访问外部变量的过滤器 filter_input()
  1. echo '<br>';
  2. var_dump(filter_input(INPUT_GET, 'p', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]));
  3. //url中的数据全是字符串
  4. //对值进行验证过滤
  • 同时验证多个外部变量:filter_input_array()
  1. $args = [
  2. 'username' => FILTER_SANITIZE_STRING,
  3. 'email' => FILTER_VALIDATE_EMAIL,
  4. 'age' => ['filter' => FILTER_VALIDATE_INT, 'flags' => FILTER_REQUIRE_SCALAR, 'options' => ['min_range' => 18]],
  5. 'blog' => FILTER_VALIDATE_URL,
  6. ];
  7. //FILTER_REQUIRE_SCALAR 要求标量
  8. //标量:单值变量,字符串,布尔,数值
  9. //复合:对象,数组
  10. var_dump(filter_input_array(INPUT_GET, $args));

5. 常量

5.1 特征

序号 特征
1 常量前面没有美元符号$
2 常量创建时必须初始化
3 常量禁止更新和删除
4 常量不受作用域限制
5 推荐使用大写字母加下划线命名

5.2 函数/关键字

序号 定义方式 描述
1 get_defined_constants() 查看系统所有常量
2 defined() 检测常量是否存在
3 define() 创建常量
4 const 关键字 创建常量
5 constant() 获取常量值
  • get_defined_constants(true): 常量分组打印,自定义常量在user分组
  • defined(): 返回布尔值

  • 如何查询常量

  1. <?php
  2. # 常量
  3. // 常量是代码中不需要更新的数据
  4. // print_r(get_defined_constants());
  5. // 分组查看
  6. // print_r(get_defined_constants(true));
  7. define('APP_PATH', __DIR__ . '/app/admin');
  8. print_r(get_defined_constants(true)['user']);
  • 使用函数 define()定义常量
  1. # 使用函数define()
  2. define('LECTURE', '朱老师是我的讲师');
  3. //const 关键字
  4. const COURSE = 'php';
  5. // 常量不受作用域限制
  6. function test1()
  7. {
  8. echo LECTURE . '教:' . COURSE . '<br>';
  9. //define()可以用在函数中声明
  10. define('SEX', '男');
  11. echo SEX . '<br>';
  12. //const不能用于函数中
  13. }
  14. test1();
  • 使用 const 定义常量
  1. //const用在类中,创建类常量
  2. class Lemo
  3. {
  4. const HELLO = 'php.cn';
  5. }
  6. echo Lemo::HELLO . '<br>';

define()可以用在函数中声明,const 不能用于函数中
流程控制中,define 可以用,const 也不能用
const 用在类中,创建类常量
常量通常只允许用标量进行初始化
标量:单值变量,字符串,数值,布尔,null

  • php7.0+支持数组初始化常量
  1. const DB_LINKS = [
  2. 'host' => 'localhost',
  3. 'username' => 'root',
  4. 'password' => 'root',
  5. 'charset' => 'utf8',
  6. ];
  7. echo '<pre>' . print_r(DB_LINKS, true) . '</pre>';
  • echoconstant()输出常来给你的区别
  1. //constant()
  2. echo constant('LECTURE') . '<br>';
  3. $constantName = 'EMAIL';
  4. echo constant($constantName);
  5. echo '<hr>';
  6. define('USER_NAME', '其实我也是一个常量');
  7. define('', '其实我也是一个常量');
  8. echo '';
  9. echo constant('');

常量隐藏在变量名中,以及常量是空的情况下需要使用 constant()

5.3 预定义常量

预定义常量非常多,有许多与具体扩展相关,如 PDO, 这里仅列出系统级常用的:

序号 预定义常量 描述
1 PHP_VERSION PHP 版本
2 PHP_MAXPATHLEN PHP 路径最大长度:1024
3 PHP_OS_FAMILY 操作系统:Windows/Darwin/Linux
4 PHP_SAPI web 服务器与 php 之间接口: apache2handler
5 PHP_EOL 行尾结束符
6 PHP_INT_MAX 最大整数: 9223372036854775807
7 PHP_INT_MIN 最小整数: -9223372036854775808
8 PHP_INT_SIZE 整数宽度: 8
9 PHP_FLOAT_MAX 最大浮点数:1.7976931348623E+308
10 PHP_FLOAT_MIN 整小浮点数: 2.2250738585072E-308
11 DEFAULT_INCLUDE_PATH 默认 PHP 命令路径
12 PHP_EXTENSION_DIR 默认 PHP 扩展路径
13 E_ERROR 运行时错误: 致命中断
14 E_PARSE 语法解析错误: 致命中断
15 E_NOTICE 运行时提示: 不中断
16 E_WARNING 运行时警告: 不中断
17 E_ALL 所有级别错误(除E_STRICT)
18 E_STRICT 更加严格的错误处理机制,高于E_ALL
19 TRUE 布尔真
20 FALSE 布尔假
21 NULL
22 DIRECTORY_SEPARATOR 目录分隔符

更多预定义常量:https://www.php.net/manual/zh/reserved.constants.php

6. 魔术常量

  • 魔术常量也属于”预定义常量”, 比较特殊所有单独列出
  • 所谓”魔术”, 是指常量的值, 会随它们在代码中的位置改变而改变
  • 魔术常量不区分大小写, 但是推荐全部大写
序号 魔术常量 描述
1 __LINE__ 文件中的当前行号
2 __FILE__ 文件的完整路径和文件名
3 __DIR__ 文件所在目录
4 __FUNCTION__ 当前的函数名称
5 __CLASS__ 当前类名称
6 __TRAIT__ 当前Trait名称
7 __METHOD__ 当前类方法名称
8 __NAMESPACE__ 当前命名空间名称
  1. <?php
  2. # 魔术常量
  3. echo '当前行号:' . __LINE__ . '<br>';
  4. echo '当前文件:' . __FILE__ . '<br>';
  5. echo '当前目录:' . __DIR__ . '<br>';
  6. function hello121()
  7. {
  8. echo __FUNCTION__;
  9. }
  10. hello121();
  11. echo '<hr>';
  12. class D
  13. {
  14. public function index()
  15. {
  16. echo __METHOD__;
  17. }
  18. }
  19. (new D)->index();

7.学习总结

本节课重点学习了变量过滤器和常量的概念以及如何定义使用,发现变量的本质是为了实现数据共享,而常量是预定义或者自定义且禁止更新/删除。

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