Blogger Information
Blog 62
fans 2
comment 1
visits 42284
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP 02 变量作用域-常量(const)-命名空间(namespace)-过滤器(filter)
老黑
Original
778 people have browsed it

主要内容:

  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>';
Correcting teacher:GuanhuiGuanhui

Correction status:qualified

Teacher's comments:实战打印结果图?
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post