博客列表 >变量类型、超全局变量、静态变量、变量与常量作用域和过滤器的理解

变量类型、超全局变量、静态变量、变量与常量作用域和过滤器的理解

若是梦终会醒
若是梦终会醒原创
2020年04月17日 18:50:48836浏览

变量、过滤器和常量

1.1 函数作用域

函数作用域是function关键字创建的作用域

  1. function index()
  2. {
  3. $date['uid'] = 1;
  4. return $date['uid'];
  5. }
  6. unset($date['uid']);//未定义报错
  7. echo index();//1
  8. unset($date['uid']);//未定义报错
  9. function add()
  10. {
  11. $date['pid'] = 1;
  12. unset($date['pid']);
  13. unset($date['uid']);
  14. return $date['pid'];//未定义报错
  15. }
  16. echo add();//无输出
  17. echo index();//1

小结:

date[‘uid’]只能在index函数中起作用 在index函数外访问会出现未定义报错

1.2 全局作用域

函数之外的变量生效范围

1.3 变量类型

  • 私有变量
  • 全局变量
  • 超全局变量

1.3.1 私有变量

函数中定义的变量

1.3.2 全局变量

函数之外定义的变量

1.3.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.3.4 global 和 $GLOBALS 的使用

  1. global $name="xu.bug";//Parse error: syntax error, unexpected '=', expecting ',' or ';'
  2. function index()
  3. {
  4. //试图引用函数外面的变量
  5. echo "myname is ".$name."<br>";
  6. }
  7. index();

即上述代码有错误。原因是 global的用法不对,不能在用global声明变量的同时给变量赋值。

  1. global $name;
  2. $name="xu.bug";
  3. function index()
  4. {
  5. //试图引用函数外面的变量
  6. echo "myname is ".$name."<br>";//Notice:Undefined variable: name in
  7. myname is
  8. }
  9. index();

即上述代码有错误。原因是 global的用法不对,不能在用global声明变量的同时给变量赋值。

综合以上得出结论:

global的正确用法是:”在一个函数中引入外部的一个变量,如果该变量没有通过参数传递进来,那么就通过global引入进来。” 也就是说,当一个函数引用一个外部变量时,可以在函数内通过global来声明该变量,这样该变量就可以在函数中使用了(相当于当作参数传递进来)。

  1. $name="xs.bug";
  2. function index()
  3. {
  4. global $name;
  5. //试图引用函数外面的变量
  6. echo "myname is ".$name."<br>";
  7. }
  8. index(); //myname is xs.bug

即上述代码说明global是起传递参数的作用,而并非使变量的作用域为全局 。

  1. $name="xs.bug";
  2. function index()
  3. {
  4. $gname=$GLOBALS['name'];
  5. //试图引用函数外面的变量
  6. echo "myname is ".$gname."<br>";
  7. }
  8. index(); //myname is xs.bug

1.3.5 static 静态变量

在函数执行完后,变量值仍然保存 不用静态变量 调用函数后会马上进行销毁

  1. function testStatic() {
  2. static $val = 1;
  3. echo $val;
  4. $val++;
  5. }
  6. testStatic(); //output 1
  7. testStatic(); //output 2
  8. testStatic(); //output 3

1.4 filter过滤器

相关函数

filter_list() 获去过滤器名称

filter_id() 获去过滤器id

filter_input(); 单个传参值验证

filter_input_array(); 数组传参验证

  1. foreach (filter_list() as $filter) {
  2. echo $filter.'------'.filter_id($filter).'<br>';
  3. }
  4. //可遍历出所有名称和id

简单验证

  1. $args = [
  2. 'username' => 513,
  3. 'email' => 274,
  4. 'age' => ['filter' => 257, 'flags'=>FILTER_REQUIRE_SCALAR, 'options' => ['min_range' => 18,'max_range'=>80]],
  5. 'blog' => 273,
  6. ];
  7. var_dump(filter_input_array(INPUT_GET, $args));.

1.5 常量

在整个运行过程中,固定不变的值

1.5.1 定义常量

1 define(常量名,值,[是否区别大小写]) true表示不区分大小写,默认是false,常量名前没有$符,常量名推荐使用大写

  1. <?php
  2. define('NAME','tom'); //定义常量
  3. define('PI',3.14,true); //定义常量,不区分大小写
  4. echo NAME,'<br>',Pi;
  5. //true表示不区分大小写,默认是区分大小写的。

2、定义常量可以用特殊字符,但是在调用的时候必须用constant关键字调用

  1. define('%-%','tom');
  2. echo constant('%-%'); //通过constant获取特殊字符作为常量名的常量

3、判断常量是否定义,通过defined()判断常量是否已经定义

  1. if(!defined('NAME')){
  2. define('NAME','berry');
  3. }
  4. echo NAME; //berry

4、还可以使用const关键字定义常量

  1. const NAME='tom';
  2. echo NAME; //tom

5、define()和const 区别

define()可以函数和流程控制中定义 而const不行

const 可以用在类中 而 define()不行

1.5.2魔术常量

  • 魔术常量属于”预定义常量”, 比较特殊所以单独列出
  • 所谓”魔术”, 是指常量的值, 会随它们在代码中的位置改变而改变
  • 魔术常量不区分大小写, 但是推荐全部大写
序号 魔术常量 描述
1 __LINE__ 文件中的当前行号
2 __FILE__ 文件的完整路径和文件名
3 __DIR__ 文件所在目录
4 __FUNCTION__ 当前的函数名称
5 __CLASS__ 当前类名称
6 __TRAIT__ 当前Trait名称
7 __METHOD__ 当前类方法名称
8 __NAMESPACE__ 当前命名空间名称
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议