博客列表 >PHP变量作用域,与常量的定义,访问,命名空间,过滤器

PHP变量作用域,与常量的定义,访问,命名空间,过滤器

new
new原创
2020年07月13日 18:21:12626浏览

1.变量作用域

作用域的意义:

  • 作用域是变量的生效范围;
  • 作用域是查找变量的工具。

在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问:

  1. <?php
  2. $x=5; // 全局变量
  3. function getInfo()
  4. {
  5. $y=10; // 局部变量
  6. echo "<p>测试变量在函数内部:<p>";
  7. echo "变量 x 为: $x";
  8. echo "<br>";
  9. echo "变量 y 为: $y";
  10. }
  11. getInfo();
  12. echo "<p>测试变量在函数外部:<p>";
  13. echo "变量 x 为: $x";
  14. echo "<br>";
  15. echo "变量 y 为: $y";
  16. ?>

在函数中不能直接访问全局变量,要用global声明或者用超全局变量$GLOBALS来访问

  1. <?php
  2. // 全局作用域
  3. $name = 'll';
  4. // 全局变量自动成为超全局数组$GLOBALS中的元素
  5. echo '<pre>' . print_r($GLOBALS, true) . '</pre>';
  6. echo $GLOBALS['name'];
  7. echo '<hr>';
  8. // 函数作用域
  9. function getInfo()
  10. {
  11. // return $myname;
  12. // 在函数中不能直接访问全局变量,要用global声明或者用超全局变量$GLOBALS来访问
  13. // 1.global声明
  14. // global $name;
  15. // return $name;
  16. // 2.超全局变量$GLOBALS访问
  17. return $GLOBALS['name'];
  18. }
  19. echo getInfo();

2.常量的定义,访问与命名空间

定义常量注意事项:

常量前没有$
常量必须初始化(定义时赋值)
常量不能删除(如 unset )
常量不受作用域限制
常量推荐全部大写,多个单词之间使用下划线连接
类常量只允许用const(不能使用 define())


  1. <?php
  2. // 查看当前系统常量
  3. print_r(get_defined_constants(true));
  4. // 自定义常量,两种方式:const、define()。
  5. const MY_NAME = 'lake';
  6. define('MY_AGE', 18);
  7. // 只查看自定义常量,相当于只看系统常量数组中的一个元素
  8. print_r(get_defined_constants(true)['user']);
  9. // 类中的常量只允许用const定义,用define()会报错
  10. class People
  11. {
  12. const NAME = 'lake';
  13. }
  14. echo '<br>';
  15. // 如果常量名放在一个变量中,用constent()输出常量的值
  16. $name = 'MY_NAME';
  17. echo constant($name);
  18. echo '<br>';
  19. // null也可以用作常量名,但要用constant()获取值
  20. define('', '男');
  21. echo constant('');

预定义常量与魔术常量

  • 魔术常量的值随系统变化而变化,无法自定义。
    1. <?php
    2. // 预定义常量:
    3. echo '版本号: ' . PHP_VERSION . '<br>';
    4. echo '操作系统: ' . PHP_OS_FAMILY . '<br>';
    5. echo '最大整数: ' . PHP_INT_MAX . '<br>';
    6. echo '最大浮点数: ' . PHP_FLOAT_MAX . '<br>';
    7. echo '目录分隔符: ' . DIRECTORY_SEPARATOR . '<hr>';
    8. // 魔术常量:值随系统变化而变化,无法自定义
    9. echo '当前文件完整路径: ' . __FILE__ . '<br>';
    10. echo '当前文件所在目录: ' . __DIR__ . '<br>';
    11. echo '当前行号: ' . __LINE__ . '<br>';
    12. echo '当函数名: ' . __FUNCTION__ . '<br>';
    13. echo '当前类名: ' . __CLASS__ . '<br>';
    14. echo '当前trait名: ' . __TRAIT__ . '<br>';
    15. echo '当前类方法名: ' . __METHOD__ . '<br>';
    16. echo '当前命名空间: ' . __NAMESPACE__ . '<br>'

命名空间

  • 类、函数、接口、常量都是全局成员,不允许重复定义。解决全局成员的命名冲突问题。
  1. <?php
  2. // 命名空间
  3. namespace name1 {
  4. const MY_NAME = 'are';
  5. }
  6. namespace name2 {
  7. const MY_NAME = 'lake';
  8. }
  9. // 全局空间,默认空间没有名称
  10. namespace {
  11. echo name1\MY_NAME;
  12. echo '<br>';
  13. echo name2\MY_NAME;
  14. }

3.过滤器

  • 过滤器部分示例
    1. <?php
    2. // 查看当前php版本支持的过滤器
    3. // foreach (filter_list() as $filter) {
    4. // echo $filter . ' => ' . filter_id($filter) . '<br>';
    5. // }
    6. // echo '<hr>';
    7. // 1.单个变量过滤:filter_var(变量名, 过滤器常量)
    8. // $age = 18;
    9. // var_dump(filter_var($age, FILTER_VALIDATE_INT));
    10. // echo '<hr>';
    11. // 2.多个变量过滤:filter_var_array()
    12. // $name = 'lake';
    13. // $age = 10;
    14. // $sex = '男';
    15. // 将变量放到一个数组中
    16. // $people = ['name' => 'lake', 'age' => 10, 'sex' => '男'];
    17. // var_dump(filter_var_array($people, FILTER_VALIDATE_INT));
    18. // echo '<br>';
    19. // var_dump(filter_var_array($people, 513));
    20. // echo '<hr>';
    21. // 3.外部变量过滤:filter_input(输入类型, 变量名, 过滤器, 可选参数)
    22. // echo '标题:' . $_GET['title'];
    23. // 范围用'options' => ['min_range' => 22, 'max_range' => 55]表示
    24. // $data = ['options' => ['min_range' => 2000, 'max_range' => 10000]];
    25. // var_dump(filter_input(INPUT_GET, 'cost', FILTER_VALIDATE_INT, $data));
    26. // echo '<hr>';
    27. // 4.验证多个外部变量:filter_input_array()
    28. $data = [
    29. 'name' => FILTER_SANITIZE_STRING,
    30. 'cost' => FILTER_VALIDATE_INT,
    31. 'exp' => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 2, 'max_range' => 10]],
    32. 'web' => FILTER_VALIDATE_URL
    33. ];
    34. var_dump(filter_input_array(INPUT_GET, $data));
  • 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
  • 过滤器主要分为二类: 验证过滤器, 清理过滤器

验证过滤器常量

  • 验证过滤器: 又叫”验证器”, 主要用于数据的类型和格式验证
序号 过滤器函数 描述
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 除以上情形外

清理过滤器常量

  • 清理过滤器: 去掉非法字符,仅保留指定内容
序号 过滤器函数 描述
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()

选项与标志

  • 可以对过滤器设置选项和标志, 对数据进行更加精准的过滤处理
  • 选项与标志使用数组键名表示: 'options'=>[...], 'flags'=>...(复数)
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议