Blogger Information
Blog 19
fans 0
comment 0
visits 16176
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP基础知识常量与变量、过滤器的认识与理解、
῀℡῀ᵒᵐᵍᵎᵎᵎ
Original
613 people have browsed it

变量

1. 作用域

  • 变量作用域,也叫”变量范围”, 即定义变量时的上下文环境
  • 变量作用域,通俗的说,就是变量的生效范围
  • 一个变量必定属于一个作用域, 这个作用域也包括了当前作用域中引入其它文件
  • 也有不受作用域限制的变量,例如超全局变量, 在程序中任何地方都是有定义的
  • 函数作用域: php 中只有函数可以创建作用域, 函数之外的代码全部在全局空间中
序号 作用域 描述
1 函数作用域 使用function关键字创建的作用域
2 全局作用域 函数之外的变量生效范围
  • php 中没有块作用域的概念, 这与其它编程语言不同, 请留意
  • 根据作用域不同, 变量可以分为三类:
序号 变量类型 描述
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 通过环境方式传递给当前脚本的变量的数组

代码演示

  1. <?php
  2. //超全局变量变量不需要定义,也不需要初始化
  3. //变量作用域
  4. $setName = 'php中文网';
  5. //全局变量会自动注册也为超全局变量数组$GLOBAL的一个值
  6. //print_r($GLOBALS['setName']);
  7. //声明函数:同时也创建一个作用域
  8. function getInfo() : string{
  9. //定义一个函数“私有变量”
  10. //方法一:global
  11. //global $setName;
  12. //方法二:定义超全局变量
  13. $private = $GLOBALS['setName'];
  14. //函数中可以直接引用超全局变量
  15. echo $_SERVER['SCRIPT_NAME'].'<br>';
  16. return $private;
  17. }
  18. echo getInfo();
  19. echo $_SERVER['SCRIPT_NAME'].'<br>';

2. 静态变量

2.1 基本常识

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

2.2 应用场景

  • 当多次调用同一函数,且要求每次调用之间共享或保留某些变量的时候
  • 尽管全局变量也可以办到,但没必要, 采用局部静态变量更合适

2.3代码演示

  1. <?php
  2. # 静态变量
  3. namespace one;
  4. function test(): float
  5. {
  6. // 私有变量,也叫动态变量,在函数中每一次都会自动初始化
  7. // 并且无法在多次调用过程中保持不变
  8. $sum = 0;
  9. $sum = $sum + 1;
  10. return $sum;
  11. }
  12. echo test(), '<br>';
  13. echo test(), '<br>';
  14. echo test(), '<br>';
  15. echo '<hr>';
  16. // 命名空间
  17. // 不同的目录下面可以有相同的文件名
  18. namespace ns2;
  19. // 全局变量
  20. $sum = 0;
  21. function test(): float
  22. {
  23. global $sum;
  24. $sum = $sum + 1;
  25. return $sum;
  26. }
  27. echo test(), '<br>';
  28. echo test(), '<br>';
  29. echo test(), '<br>';
  30. echo '<hr>';
  31. namespace two;
  32. function test(): float
  33. {
  34. // 局部静态变量: 只在函数第一次调用的时候被初始化,以后不会再被更新了
  35. // 静态变量,可以理解为在函数中的"伪全局变量"
  36. // 实现函数在多次调用的过程中共享数据
  37. static $sum = 0;
  38. $sum = $sum + 1;
  39. return $sum;
  40. }
  41. echo test(), '<br>';
  42. echo test(), '<br>';
  43. echo test(), '<br>';
  44. echo '<hr>';
  45. $num1 = 20;
  46. // 变量的本质是数据共享
  47. // 函数的本质是代码共享
  48. echo $num1 + 40;
  49. echo '<br>';
  50. echo $num1 + 20;
  51. echo '<br>';
  52. echo $num1 + 90;

3.超全局变量

  • 超全局变量有哪些
    • $GLOBALS :储存全局作用域中的变量
    • $_SERVER :获取服务器相关信息
    • $_REQUEST :获取POST和GET请求的参数
    • $_POST : 获取表单的POST请求参数
    • $_GET: 获取表单的GET请求参数
    • $_FILES :获取上传文件的的变量
    • $_ENV : 获取服务器端环境变量的数组
    • $_COOKIE:获取浏览器的cookie
    • $_SESSION : 获取session

变量过滤器

  • PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入

1.变量过滤器:

全部变量过滤器:

int => 257
boolean => 258
float => 259
validate_regexp => 272
validate_domain => 277
validate_url => 273
validate_email => 274
validate_ip => 275
validate_mac => 276
string => 513
stripped => 513
encoded => 514
special_chars => 515
full_special_chars => 522
unsafe_raw => 516
email => 517
url => 518
number_int => 519
number_float => 520
magic_quotes => 521
add_slashes => 523
callback => 1024

如需过滤变量,请使用下面的过滤器函数之一:

  • filter_var() - 通过一个指定的过滤器来过滤单一的变量
  • filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
  • filter_input - 获取一个输入变量,并对它进行过滤
  • filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤

代码演示

  1. <?php
  2. # 变量过滤器
  3. // foreach (filter_list() as $filter) {
  4. // echo $filter . ' => ' . filter_id($filter) . '<br>';
  5. // }
  6. // echo '<hr>';
  7. // 1. 过滤单个变量filter_var()
  8. // 年龄
  9. $age = 30;
  10. $age = '30';
  11. $age = 68;
  12. var_dump(filter_var($age, FILTER_VALIDATE_INT,['options'=>['min_range'=>18,'max_range'=>60]]));
  13. echo '<hr>';
  14. $email = 'admin@php.cn';
  15. $email = 'admin@';
  16. var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
  17. var_dump(filter_var($email, 274));
  18. echo '<hr>';
  19. // 2. 过滤单个变量filter_var_array()
  20. var_dump(filter_var_array([100, 'php'], FILTER_VALIDATE_INT));
  21. echo '<hr>';
  22. // 3. 检测是否存在指定的外部变量, filter_has_var()
  23. // 对于URL中的查询字符串: 在URL地址?后面的键值对
  24. // php.cn/index.php?
  25. // id=10
  26. // name=admin
  27. // INPUT_GET: 表示要检测的是$_GET,就是get参数,其实就是get请求
  28. // INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV
  29. var_dump(filter_has_var(INPUT_GET, 'page'));
  30. echo '<hr>';
  31. echo 'get变量p = ' . $_GET['p'];
  32. echo '<hr>';
  33. // 4. 访问外部变量的过滤器,filter_input
  34. var_dump(filter_input(INPUT_GET, 'p',FILTER_VALIDATE_INT, ['options'=>['min_range'=>1]]));
  35. // echo filter_input(INPUT_GET, 'p',FILTER_VALIDATE_INT, ['options'=>['min_range'=>1]]) ? '页码OK': '页码非法';
  36. // 5. 同时验证多个外部变量: filter_input_array()
  37. echo '<hr>';
  38. $args = [
  39. 'username' => FILTER_SANITIZE_STRING,
  40. 'email' => FILTER_VALIDATE_EMAIL,
  41. 'age' => ['filter' => FILTER_VALIDATE_INT, 'flags'=>FILTER_REQUIRE_SCALAR, 'options' => ['min_range' => 18]],
  42. 'blog' => FILTER_VALIDATE_URL,
  43. ];
  44. // 标量:单值变量, 字符串, 布尔, 数值,
  45. // 复合: 对象, 数组
  46. var_dump(filter_input_array(INPUT_GET, $args));

常量

1.常量的固有特征和常量的定义

  • define()函数有固定的值,不能让后面的程序代码修改他们的值了
  • define()函数和关键字const定义常量的区别是,前者是在全局空间中都会生效,而后者如果定义了命名空间,只有在命名空间下才会生效;

1.1代码演示

  1. /*
  2. 常量命名的要求和变量一样,但是约定俗成的规则(最好这样用):全大写
  3. 下面是定义一个名为π的常量
  4. */
  5. //常量也是超全局的
  6. define('PAI',3.1415926);
  7. // 常量是不用加$符的,加了就要出问题!
  8. echo PAI; //3.1415926

1.2代码演示

  1. <?php
  2. # 定义常量
  3. // define()函数
  4. define('LECTURE', '朱老师');
  5. // const 关键字
  6. const COURSE = 'PHP';
  7. // 常量不受作用域限制
  8. function test1()
  9. {
  10. echo LECTURE . '教: ' . COURSE . '<br>';
  11. define('SEX', '男');
  12. echo SEX . '<br>';
  13. // const不能用在函数中
  14. // const AGE = 30;
  15. // echo AGE;
  16. }
  17. test1();
  18. echo '<hr>';
  19. // 流程控制中,define能用, const不能用
  20. if (true) {
  21. define('EMAIL', 'admin@php.cn');
  22. // const EMAIL = 'admin@php.cn';
  23. // echo EMAIL;
  24. }
  25. // const用在类中,创建类常量
  26. class Demo
  27. {
  28. const HELLO = 'php.cn';
  29. // define('A', 100);
  30. }
  31. echo Demo::HELLO.'<br>';
  32. // echo Demo::A.'<br>';
  33. // 常量通常只允许用标量进行初始化
  34. // 标量: 单值变量, 字符串, 数值,布尔, null
  35. // php7.0+支持数组初始化常量
  36. const DB_LINKS = [
  37. 'host'=>'localhost',
  38. 'username'=>'root',
  39. 'password'=>'root',
  40. 'charset'=>'utf8',
  41. ];
  42. echo '<pre>'.print_r(DB_LINKS,true).'</pre>';
  43. // constant()
  44. echo constant('LECTURE'). '<br>';
  45. echo LECTURE. '<br>';
  46. $constantName = 'EMAIL';
  47. echo constant($constantName);
  48. echo '<hr>';
  49. define('USER_NAME', '其实我也是一个常量');
  50. define('', '其实我也是一个常量');
  51. echo '';
  52. echo constant('');

2.预定义常量

2.1 PHP可以用预定义常量来获取PHP中的信息。常用的预定义常量如下:

  • FILE 默认常量,是指PHP程序文件名及路径;
  • LINE 默认常量,是指PHP程序的行数;
  • CLASS: 类的名称;
  • METHOD: 类的方法名;
  • PHP_VERSION 内建常量,是指PHP程序的版本;
  • PHP_OS 内建常量,是指PHP解析器的操作系统的名称;
  • TRUE 是指真值(true);
  • FALSE 是指假指(false);
  • NULL 是指空值(null);
  • E_ERROR 是指最近的错误之处;
  • E_WARNING 是指最近的警告之处;
  • E_PARSE 是指解析语法有潜在的问题之处;
  • E_NOTICE 是指发生不同寻常的提示,但不一定是错误处;

注意:“FILE” “LINE ” “CLASS” “METHOD_” 中的“”是指两个下划线,不是指一个下划线。

3.魔术常量

  • 所谓的魔术常量就是PHP预定义的一些常量,这些常量会随着所在的位置而变化,也是预定义常量
  • LINE 获取文件中的当前行号
  • FILE 获取文件的完整路径和文件名
  • DIR 获取文件所在目录
  • FUNCTION 获取函数名称
  • CLASS 获取类的名称
  • METHOD 获取类的方法名
  • NAMESPACE 当前命名空间的名称(区分大小写)
  • TRAIT Trait 的名字

3.1代码演示

  1. <?php
  2. # 魔术常量
  3. echo '当前行号: ' . __LINE__ . '<br>';
  4. echo '当前文件: ' . __FILE__ . '<br>';
  5. echo '当前目录: ' . __DIR__ . '\demo6.php<br>';
  6. function hello123()
  7. {
  8. echo __FUNCTION__;
  9. }
  10. hello123();
  11. echo '<hr>';
  12. class D
  13. {
  14. public function index()
  15. {
  16. echo __METHOD__;
  17. }
  18. }
  19. (new D)->index();

课后总结

php学习有难记忆的,理解记忆还是容易很多

Correcting teacher:天蓬老师天蓬老师

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