博客列表 >PHP基础-变量、变量过滤器、常量

PHP基础-变量、变量过滤器、常量

岂几岂几
岂几岂几原创
2020年04月17日 15:42:13691浏览

变量

7. 作用域

  • 变量作用域,也叫“变量范围”,即定义变量时的上下文环境,通俗说就是变量能使用的范围。类似“身份证”,中国的身份证在中国境内有效,在美国却不能用。
  • 一个变量必须属于一个作用域。除开PHP运行环境中的几个超级VIP(超全局变量)。
  • php中的作用域只有函数作用域和全局作用域。函数之外的代码都在全局空间中。
序号 作用域 描述
1 函数作用域 使用function关键字创建的作用域
2 全局作用域 函数之外的作用域
  1. <?php
  2. # 变量作用域
  3. // 在函数之外定义,所以是全局作用域
  4. $siteName = 'php中文网';
  5. echo $siteName . '<br>';
  6. function getInfo(): string {
  7. // 函数作用域
  8. $siteName = 'php.cn';
  9. return $siteName
  10. }
  11. 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 通过环境方式传递给当前脚本的变量的数组

8. 静态变量

  • 在函数中用static关键字定义静态变量。
  • 静态变量定义时必须初始化,且只能初始化一次,默认值为’0’.无论函数被调用多少次,静态变量定义的语句都只在第一次函数被调用时执行,之后的调用均不执行。
  • 函数执行完后,静态变量的值保持不变,下次调用该函数时,静态变量的值会保留上次函数执行结束后的值。
  • 函数中的静态变量也是私有变量,全局不可访问。
  • 使用场景:在多次调用函数时,共享数据时使用。
  1. function callMe():void {
  2. static $sum = 0;
  3. $sum += 1;
  4. echo '现在是第' . $sum . '次调用callMe()函数<br>';
  5. }
  6. callMe();
  7. callMe();
  8. callMe();
  9. callMe();
  10. callMe();

变量过滤器

如果我们对变量的取值有要求,就可以用变量过滤器来验证某个变量的值是否符合要求。

  • 使用filter_var()验证单个变量的值是否符合要求。
  • filter_var_array()验证变量数组的值是否符合要求。
  • 使用场景:验证web请求中的参数值的有效性。
    变量过滤器使用:
  1. <?php
  2. # 变量过滤器
  3. ## 遍历当前系统中的所有过滤器
  4. /* foreach (filter_list() as $filter) {
  5. echo $fileter . '===>' . filter_id($filter), '<br>';
  6. } */
  7. ## 1. 过滤单个变量filter_var(变量, 验证器常量/验证器id, 值域), 即验证某个变量的值是不是某种数据类型
  8. $age = 30;
  9. $age = '30';
  10. var_dump(filter_var($age, FILTER_VALIDATE_INT));
  11. echo '<br>';
  12. #### tips: FILTER_VALIDATE_INT可以验证数字字符串.
  13. ## 1.1. 既验证某个变量的值是不是某种数据类型, 又验证数值在指定的范围里
  14. $age = '30';
  15. $age = 200;
  16. // 验证$age的值是否是数字/数字字符串, 且数值在18-60之间.
  17. var_dump(filter_var($age, FILTER_VALIDATE_INT, ['options' => ['min_range' => 18, 'max_range' => 60]]));
  18. ## 1.2. 过滤邮箱(过滤器id=274)
  19. $email = 'admin@qq.com';
  20. $email = 'aaaa';
  21. var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
  22. echo '<br>';
  23. // 跟上面同样效果
  24. var_dump(filter_var($email, 274));
  25. echo '<br>';
  26. ## 2. 过滤多个变量(数组):filter_var_array(数组, 验证器常量/验证器id)
  27. var_dump(filter_var_array([50, 'hello'], FILTER_VALIDATE_INT));
  28. ## 3. 检测是否存在指定的外部变量
  29. // 如:url中的参数字符串(给访问本脚本的url中加上:?p=100)
  30. // INPUT_GET: 表示要验证在get请求参数值中是否存在xx参数
  31. // 其他参数: INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV
  32. var_dump(filter_has_var(INPUT_GET, 'p'));
  33. echo '<br>';
  34. /* $_GET[param]的方式获取数据很容易早到跨站攻击 */
  35. ## 4. 验证外部变量是否存在的过滤器
  36. var_dump(filter_input(INPUT_GET, 'p'));
  37. echo '<br>';
  38. ### 4.1. 验证get请求中p参数是否存在, 若存在, 数值是否大于等于1
  39. var_dump(filter_input(INPUT_GET, 'p', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]));
  40. ## 5. 同时验证多个外部变量filter_input_array()
  41. // $args = ['paramName1' => FILTER_NAME1, 'paramName2' => ['filter'=>FILTER_NAME2, 'flags'=>FILTER_REQUIRE_SCALAR, 'options' => ...], ...]
  42. $args = [
  43. 'username' => FILTER_SANITIZE_STRING,
  44. 'email' => FILTER_SANITIZE_EMAIL,
  45. 'age' => [
  46. 'filter' => FILTER_VALIDATE_INT,
  47. 'flags' => FILTER_REQUIRE_SCALAR,
  48. 'options' => ['min_range' => 18, 'max_range' => 60]
  49. ], 'blog' => FILTER_SANITIZE_URL
  50. ];
  51. // 测试url1: http://php.edu/0416/demo3.php?username=<p>zhangsan</p>&email=test@&age=1&blog=blog.admin.cn
  52. // 测试url2: http://php.edu/0416/demo3.php?username=zhangsan&email=test@php.cn&age=19&blog=http://blog.admin.cn
  53. var_dump(filter_input_array(INPUT_GET, $args));

常量

1. 特征

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

2. 函数/关键字

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

定义常量:

  1. <?php
  2. # 定义常量
  3. ## 1. 方法1:使用define()函数定义
  4. define('LECTURE', '朱老师');
  5. ## 2. 方法2:用const关键字
  6. const COURSE = 'PHP';
  7. ## 3. 常量不受作用域限制
  8. function test1()
  9. {
  10. echo LECTURE . '教' . COURSE . '<br>';
  11. }
  12. test1();
  13. ## 4. 在函数体中可以用define()定义常量, const不行.
  14. function test2()
  15. {
  16. define('HELLO', 'hello');
  17. // 用const会报错
  18. /* const HELLO = 'hello'; */
  19. }
  20. test2();
  21. echo HELLO;
  22. ## 5. 在流程控制语句中, define能用, const不能用
  23. if (true) {
  24. define('TEST', 'test');
  25. // 用const会报错
  26. /* const TEST = 'test'; */
  27. echo TEST;
  28. }
  29. ## 6. 在类中声明常量成员, 要用const, 不能用define()
  30. class Demo
  31. {
  32. const CONST1 = 'hello!';
  33. }
  34. echo Demo::CONST1 . '<br>';
  35. ## 7. 常量通常只允许用标量进行初始化: 单值变量, 字符串, 数值, 布尔值, NULL
  36. ## 8. PHP7.0+支持数组初始化常量
  37. const DB_LINKS = [
  38. 'host' => 'localhost',
  39. 'username' => 'root',
  40. 'password' => 'root',
  41. 'charset' => 'utf8'
  42. ];
  43. echo '<pre>';
  44. echo print_r(DB_LINKS, true);
  45. echo '</pre>';

常量相关函数

  1. <?php
  2. # 常量相关函数
  3. ## 1. 查看系统中有哪些常量
  4. // 1.1.get_defined_constants():查看所有常量
  5. print_r(get_defined_constants());
  6. // 1.2.入参true表示分组查看
  7. print_r(get_defined_constants(true));
  8. // 1.3.查看自定义常量
  9. /* 先定义一个自定义常量DIY */
  10. define('DIY', '我是自定义常量');
  11. /* 自定义常量在key='user'的值数组中 */
  12. print_r(get_defined_constants(true)['user']);
  13. ## 2. defined(常量名字符串):判断某个常量是否已定义
  14. function checkConst($constName):void {
  15. if(defined($constName)) {
  16. echo '常量' . $constName . '的值:' . constant($constName) . '<br>';
  17. } else {
  18. echo '常量' . $constName . '未定义<br>';
  19. }
  20. }
  21. define('CONST1', '我是一个常量');
  22. $constName = 'CONST2';
  23. checkConst($constName);
  24. $constName = 'CONST1';
  25. checkConst($constName);
  26. ## 3. constant(常量名字符串)函数:获取[常量名]为[入参字符串值]的[常量值].
  27. echo constant('CONST1') . '<br>';
  28. $constantName = DB_LINKS;
  29. print_r(constant($constantName));
  30. /* 使用constant()函数获取隐藏常量值 */
  31. define('', '我看你怎么获取到我');
  32. print_r(constant(''));

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 目录分隔符
  1. <?php
  2. # 预定义常量直接用就好
  3. echo PHP_OS_FAMILY;
  4. // ...

4. 魔术常量

  • 魔术常量也属于”预定义常量”, 比较特殊所有单独列出
  • 所谓”魔术”, 是指常量的值, 会随它们在代码中的位置改变而改变
  • 魔术常量不区分大小写, 但是推荐全部大写
序号 魔术常量 描述
1 __LINE__ 文件中的当前行号
2 __FILE__ 文件的完整路径和文件名
3 __DIR__ 文件所在目录
4 __FUNCTION__ 当前的函数名称
5 __CLASS__ 当前类名称
6 __TRAIT__ 当前Trait名称
7 __METHOD__ 当前类方法名称
8 __NAMESPACE__ 当前命名空间名称
  1. <?php
  2. namespace const_demo\magic_const;
  3. ## 查看当前行号:__LINE__
  4. echo '当前行号:' . __LINE__ . '<br>';
  5. ## 查看当前文件:__FILE__
  6. echo '当前文件(绝对地址):' . __FILE__ . '<br>';
  7. ## 查看当前文件所在的目录:__DIR__
  8. echo '当前文件所在的目录(不包括文件名):' . __DIR__ . '<br>';
  9. ## 查看当前命名空间名称
  10. echo '当前命名空间名称是:' . __NAMESPACE__ . '<br>';
  11. ## 查看当前函数名: __FUNCTION__
  12. function getCurrentFuncName()
  13. {
  14. echo '当前函数名是:' . __FUNCTION__;
  15. }
  16. trait Trait1 {
  17. public function hello() {
  18. echo '当前trail名称是:' . __TRAIT__;
  19. }
  20. }
  21. class Demo
  22. {
  23. use Trait1;
  24. public function index()
  25. {
  26. ## 查看当前方法名: __METHOD__
  27. echo '我的方法名是:' . __METHOD__ . '<br>';
  28. ## 查看当前类名: __CLASS__
  29. echo '我的类名是:' . __CLASS__ . '<br>';
  30. $this->hello();
  31. }
  32. }
  33. (new Demo)->index();
  34. ?>

学习心得

  • 变量的作用域就是在哪能用这个变量。函数要使用全局作用域的变量,需要一个“介绍人”。全局作用域要使用函数中的变量,需要在函数中将该变量”return”出来。
  • 超全局变量可以理解为不受作用域约束的变量,都是数组。
  • 静态变量可以认为是多次方法调用中共享数据用的量,只能一次创建,永久存在,不随方法调用结束而被销毁。
  • 常量就是某个固定值的标签,使用这个标签,就能获得这个固定值,且这个标签只要跟这个值绑定,就不能再解绑。类似钞票,假设它印出来是十块钱,就相当于这张钞票跟十元产生了绑定,并且不能把这张钞票当一百元来使用(解绑)。
  • 变量过滤器是之前没有接触过的概念,它类似海关,合法的东西可以入关;非法的东西,将不能入关(返回false)。过滤器可以验证数据类型、数据格式(email格式,url格式等)和数据范围;可以验证单变量,也可以验证数组。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议