博客列表 >PHP 02 变量作用域-常量(const)-命名空间(namespace)-过滤器(filter)

PHP 02 变量作用域-常量(const)-命名空间(namespace)-过滤器(filter)

老黑
老黑原创
2020年07月09日 22:05:44777浏览

主要内容:

  1. 变量的作用域及访问(全局vs函数,超全局)
  2. 常量、预定义常量、魔术常量、命名空间
  3. 变量过滤器(单变量、多变量,外部变量)

1. 变量的作用域及访问

(1)作用域(全局 vs 函数)

  • 作用域是变量的生效范围。作用域是查找变量的工具。
  • 作用域分为全局作用域、函数作用域。
  • 超全局变量
  1. error_reporting(E_ALL);
  2. // 1.全局作用域: 写到了函数的外部的变量
  3. $siteName = 'php中文网';
  4. // 2. 函数作用域:
  5. function getInfo()
  6. {
  7. // 访问函数外部的变量(全局变量)
  8. // 在php,函数会创建出一个独立的作用域,不能直接访问外部的变量。例如下面如果直接发挥$siteName就不行。
  9. // 私有变量
  10. $local = 'hello php.cn';
  11. // return $local;
  12. }
  13. echo getInfo();

(2)超全局变量

超全局变量,在每个脚本中都有预定义,例如$GLOBALS。若有变量都是超全局变量$GLOBALS这个数组array中的一个item。

  1. // 超全局变量,在每个脚本中都有预定义
  2. echo '<pre>'.print_r($GLOBALS,true).'</pre>';
  3. // 通过上面的方式可以让现实出来的数组更具有结构性
  4. // 在全局中创建的变量,会自动成为超全局数组$GLOBALS中的一个元素
  5. echo $GLOBALS['siteName'];
  6. // 超全局变量, 不受作用域限制,可以在函数中直接访问。

(3)函数访问全局变量的三种方式

  • 第一种:函数中直接用global直接声明需要到外部去寻找
  • 第二种:通过$GLOBALS数组来访问
  • 第三种:用常量const的方式来体现。这种方式其实不算是一种直接的访问方式。仅仅是达到部分的效果而已。
  1. const SITE_NAME = 'php中文网2';
  2. function getInfo()
  3. {
  4. // 1. 在函数中做一个声明
  5. global $siteName;
  6. return $siteName;
  7. // 2. 通过超全局变量$GLOBALS来访问
  8. return $GLOBALS['siteName'];
  9. // 3. 通过常量来实现
  10. return SITE_NAME;
  11. }
  12. echo getInfo();

(4)文件路径查询

  1. echo $_SERVER['REQUEST_URL'];
  2. echo $_SERVER['SCRIPT_FILENAME'];

2. 常量

(1)常量的查看方式

  • 查看当前有哪些可用的常量
    1. print_r(get_defined_constants(true));
  • 查询用户自定义的常量
    1. print_r(get_defined_constants(true)['user']);

(2)常量的两种创建方式

  1. //关键字: const
  2. const APP_PATH = '/phpstudy_pro';
  3. // 函数define
  4. define('APP_NAME', '客户管理系统');
  5. //类常量只允许用const
  6. class User
  7. {
  8. const NATION = 'CHINA';
  9. }

(3)常量的定义规则

  • 常量前没有$
  • 常量必须初始化,变量则可以不用初始化赋值
  • 常量不让删除,eg,unset(SEX);无效
  • 常量不受作用域限制
  • 常量推荐全部大写,多个单词之间使用下划线连接
    1. const SEX = 'famale';

(4)常量的调取

  1. echo APP_NAME;
  2. echo '<hr>';
  3. echo constant('APP_PATH');
  4. echo '<hr>';
  5. $name = 'APP_NAME';
  6. echo constant($name);
  7. echo '<hr>';
  8. //两种还是有一些区别的:例如“空”作为常量名称是
  9. //constant方式可以调取。但直接的那种方式无法调取。
  10. // 定义一个特殊常量
  11. // define('EMAIL', 'admin@php.cn');
  12. define('', 'admin@php.cn');
  13. // echo '';
  14. echo constant('');

3. 预定义常量、魔术常量、命名空间

(1)预定义常量

  1. echo '版本号: ' . PHP_VERSION . '<br>';
  2. echo '操作系统: ' . PHP_OS_FAMILY . '<br>';
  3. echo '最大整数: ' . PHP_INT_MAX . '<br>';
  4. echo '最大浮点数: ' . PHP_FLOAT_MAX . '<br>';
  5. echo '目录分隔符: ' . DIRECTORY_SEPARATOR . '<hr>';

(2)魔术常量

值是可以由系统变的,但用户自己是变不了的

  1. echo '当前文件: ' . __FILE__ . '<br>';
  2. echo '当前目录: ' . __DIR__ . '<br>';
  3. echo '当前行号: ' . __LINE__ . '<br>';
序号 魔术常量 描述
1 __LINE__ 文件中的当前行号
2 __FILE__ 文件的完整路径和文件名
3 __DIR__ 文件所在目录
4 __FUNCTION__ 当前的函数名称
5 __CLASS__ 当前类名称
6 __TRAIT__ 当前Trait名称
7 __METHOD__ 当前类方法名称
8 __NAMESPACE__ 当前命名空间名称

(3)命名空间

  • 命名空间: 解决了全局成员 的命名冲突问题
  • 在全局中常量需要具有唯一性。但在不同命名空间中,常量是一个用同一个名字的。
  • 有点类似:二个班级, 都有一个叫张三的。一班的张三, 二班的张三。
  • 针对的对象不限于常量,包括:常量、类(接口)、函数。这三(四)个就属于全局对象。
  1. // error_reporting(E_ALL); 这个会和命名空间冲突。命名空间也需要放到第一行。
  2. // 全局空间中的成员, 不允许重复定义
  3. // const APP_PATH = '/phpstudy_pro';
  4. // const APP_PATH = '/public';
  5. //其实类与函数也是全局成员, 也不允许重复定义
  6. namespace ns1 {
  7. const APP_PATH = '/phpstudy_pro';
  8. }
  9. namespace ns2 {
  10. const APP_PATH = '/public';
  11. echo \ns1\APP_PATH, "<br>";
  12. }
  • 一旦定义后就可以在其他空间或全局空间中进行访问。
  1. // 全局空间: 匿名空间
  2. namespace {
  3. echo \ns1\APP_PATH, "<br>";
  4. echo \ns2\APP_PATH, "<br>";
  5. }

4. 变量过滤器

  • 变量过滤器感觉就是一个验证器,但变量的赋值不符合的时候就给于false反馈。例如验证年龄范围、性别范围、邮箱是否正确等。
  • 可以用系统原生的底层过滤,也可以用一些外部已经封装好的东西。
  • 具体内容还是挺多的,具体如下:

    (4-1)查看当前php版本支持的预定义过滤器有哪些

  1. foreach (filter_list() as $filter) {
  2. echo $filter . ' => ' .filter_id($filter) . '<br>';
  3. }

结果如下:

(4-2)过滤单个变量

filter_var(要过滤的变量, 过滤器常量)

  1. $age = '130'; // 改成这个试试$age = 'abc';
  2. $options = ['options'=>['min_range'=> 18, 'max_range'=> 60]];
  3. var_dump(filter_var($age, FILTER_VALIDATE_INT, $options));
  4. echo '<hr>';
  5. $email = 'admin@php.cn';
  6. var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
  7. var_dump(filter_var($email, 274));
  8. //如果能找到代码,直接用代码进行验证也行。
  • 也可以通过在浏览器域名的后面敲入“?age=..”的方式进行验证。如下图:

(4-3)验证多个变量 filter_var_array()

  1. $a = 10;
  2. $b = '90';
  3. $arr = [$a, $b]; //变成一个数组。
  4. var_dump(filter_var_array($arr, FILTER_VALIDATE_INT));
  5. echo '<hr>';

(4-4)验证外部变量

  • 通常通过 http请求发送过来的,表单,get,post
  • 使用GET参数来演示外部变量的获取与验证/过滤
  • filter_input(输入类型get/post, 变量名, 过滤器, 参数)
  1. echo 'id = ' .$_GET['id'];
  2. $options = ['options'=>['min_range'=> 1]];
  3. var_dump(filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, $options));
  4. // 同时验证多个外部变量
  5. $args = [
  6. 'username'=> FILTER_SANITIZE_STRING,
  7. 'email'=>FILTER_VALIDATE_EMAIL,
  8. 'age'=> ['filter'=>FILTER_VALIDATE_INT, 'options'=>['min_range'=> 18, 'max_range'=> 60]],
  9. 'blog'=> FILTER_VALIDATE_URL
  10. ];
  11. var_dump(filter_input_array(INPUT_GET, $args));
  • 简洁操作方法(在浏览器域名输入框中直接输入)如下图:

(4-5)变量过滤器汇总

  • PHP 过滤器用于验证和过滤来自非安全来源的外部数据
  • 外部数据来源:
序号 数据来源 描述
1 表单 来自表音的用户输入数据
2 Cookies 来自浏览器中的 cookie
3 服务器变量 防止伪装的合法访问
4 Web 服务数据 Web 请求的数据
5 数据库查询结果 数据表中的数据并不可信
  • 常用的过滤器函数
序号 函数 描述
1 filter_list()
2 filter_id()
3 filter_var() 过滤单个变量
4 filter_var_array() 过滤多个变量
5 filter_has_var() 检测是否存在某个外部变量
6 filter_input() 过滤单个外部变量
7 filter_input_array() 过滤多个外部变量
  • 外部变量类型: INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV
  • 过滤器主要分为二类: 验证过滤器, 清理过滤器
4-5-1 验证过滤器常量
  • 验证过滤器: 又叫”验证器”, 主要用于数据的类型和格式验证
序号 过滤器函数 描述
1 FILTER_VALIDATE_INT 验证整数
2 FILTER_VALIDATE_FLOAT 浮点点验证
3 FILTER_VALIDATE_BOOLEAN 验证布尔项
4 FILTER_VALIDATE_EMAIL 验证邮箱
5 FILTER_VALIDATE_URL 验证 URL 地址
6 FILTER_VALIDATE_IP 验证 IP 地址
7 FILTER_VALIDATE_REGEXP 正则验证
  • FILTER_VALIDATE_BOOLEAN: 布尔选项的返回值类型
序号 返回值 描述
1 true “1”, “true”, “on” 和 “yes”
2 false “0”, “false”, “off”, “no”, “”
3 null 除以上情形外
4-5-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()
4-5-3 选项与标志
  • 可以对过滤器设置选项和标志, 对数据进行更加精准的过滤处理
  • 选项与标志使用数组键名表示: 'options'=>[...], 'flags'=>...(复数)

5. 自己的实战

(5-1)变量作用域

  1. $aUserName = 'ZhangSan';
  2. const AUSERNAME = 'LiSi';
  3. function showName(){
  4. return $GLOBALS['aUserName'];
  5. }
  6. echo showName();

(5-2)常量的定义,访问与命名空间

  1. define ('AUSERNAME', 'LiSi');
  2. echo constant ('AUSERNAME');

(5-3)常用的变量过滤器,不少于五个

  1. //① 查询所有的过滤器
  2. foreach (filter_list() as $filter) {
  3. echo $filter . ' => ' .filter_id($filter) . '<br>';}
  4. echo '<hr>';
  5. //② int范围验证
  6. $income = '1000000000';
  7. $options = ['options'=>['min_range'=> 10000, 'max_range'=> 99999999]];
  8. echo '第一个验证结果:';
  9. var_dump(filter_var($income, FILTER_VALIDATE_INT, $options));
  10. echo '<hr>';
  11. //③ email格式验证
  12. $email = 'abc@abc.com';
  13. echo '第二个验证结果:';
  14. var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
  15. echo '<hr>';
  16. //④ ip地址验证
  17. $ip = '126.1.0';
  18. echo '第三个验证结果:';
  19. var_dump(filter_var($ip, FILTER_VALIDATE_IP));
  20. echo '<hr>';
  21. //⑤ 仅保留合法的数字和正负号+-
  22. $rawdata = 'rt576';
  23. echo '第四个验证结果:';
  24. var_dump(filter_var($rawdata, FILTER_SANITIZE_NUMBER_INT));
  25. echo '<hr>';
  26. //⑥ 验证多个外部变量
  27. $loginInfo = [
  28. 'username'=> FILTER_SANITIZE_STRING,
  29. 'email'=>FILTER_VALIDATE_EMAIL,
  30. 'age'=> ['filter'=>FILTER_VALIDATE_INT, 'options'=>['min_range'=> 18, 'max_range'=> 60]],
  31. 'website'=> FILTER_VALIDATE_URL
  32. ];
  33. echo '第五个验证结果:';
  34. var_dump(filter_input_array(INPUT_GET, $args));
  35. echo '<hr>';
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议