博客列表 >PHP变量与常量

PHP变量与常量

蔚蓝世纪
蔚蓝世纪原创
2020年04月23日 21:19:22777浏览

一、PHP 变量作用域

1.变量的作用域:是脚本中变量可被引用/使用的部分,也叫“变量范围”,即定义变量时的上下文环境,也就是变量的生效范围。

2.变量的作用域可分为两种:

  1. 函数作用域:使用`function`关键字创建的作用域。
  2. 全局作用域:函数之外的变量生效范围,如:$siteName = 'php中文网'

3.根据作用域不同, 变量可以分为三类:

  1. 私有变量:定义在函数中的变量 。声明函数变量的同时,就创建了一个函数作用域。
  2. 全局变量:定义在函数之外的变量。
  3. 超全局变量:也叫预定义变量,访问不受作用域限制。不需要定义,也不需要初始化。超全局变量都要大写,且与$之间有一个下划线。

例如:我们需要访问一个全局作用域中定义的变量,那么我们可以先定义一个私有变量,想要获取这个全局作用域中的数据,但是实际上我们是接收不到返回的这个数据的,这时候,我们就需要架设一个桥梁,间接接收返回数据。这个桥梁就是关键字 global 或者超全局变量。如:

  1. //全局作用域
  2. $siteName = 'php中文网';
  3. //全局变量会自动注册成为超全局变量数组$GLOBALS 的一个值
  4. //超全局变量不受作用域限制,超全局变量都要大写,且与$之间有一个下划线
  5. print_r($GLOBALS['siteName']);
  6. //声明函数:同时也创建一个函数作用域
  7. function getInfo() : string
  8. {
  9. //定义了一个函数"私有变量"
  10. //1.方法 1:global
  11. //global $siteName;
  12. //2.使用超全局变量
  13. $private = $GLOBALS['siteName'];
  14. //函数中可以直接访问超全局变量
  15. echo $_SERVER['SCRIPT_NAME']. '<br>';
  16. return $private;
  17. }
  18. echo getInfo();
  19. echo $_SERVER['SCRIPT_NAME']. '<br>';

运行效果:

4.超全局变量的分类(需要全部记住)

  1. $GLOBALS:引用全局作用域中可用的全部变量
  2. $_SERVER:服务器和执行环境信息
  3. $_GETHTTP GET 请求:通过 URL 参数传递给当前脚本的变量的数组
  4. $_POSTHTTP POST 请求: 将变量以关联数组形式传入当前脚本
  5. $_FILESHTTP 文件上传变量,保存着上传文件的全部信息
  6. $_COOKIE:通过 HTTP Cookies 方式传递给当前脚本的变量的数组
  7. $_SESSION:当前脚本可用 SESSION 变量的数组 `$_REQUEST`:默认情况下包含了 `$_GET``$_POST` `$_COOKIE` 的数组
  8. $_ENV:通过环境方式传递给当前脚本的变量的数组。

5.静态变量

  1. 定义在函数中的静态变量使用`static`修饰,并且与函数作用域绑定。
  2. 函数中静态变量遵循私有变量约束, 全局不可访问。
  3. 局部静态变量:只在函数第一次调用的时候被初始化,以后都不会再被更新了。
  4. 静态变量,可以理解为函数中的“伪全局变量”。
  5. 实现函数在多次调用的过程中共享数据。
  6. 相对的是动态变量,即私有变量,动态变量在函数中每一次都会自动初始化,即值归0,无法在多次调用过程中保持不变。

举例:

  1. namespace ns1;
  2. function test1():float
  3. {
  4. static $sum = 0;
  5. $sum = $sum + 1;(此处若使用动态变量,每次加得的结果,只能是1,若使用静态变量,每次加得的结果都递增1.)
  6. return $sum;
  7. }
  8. echo test1(),'<br>';
  9. echo test1(),'<br>';
  10. echo test1(),'<br>';

运行效果:

二、变量过滤器

  1. 变量过滤器:就是对变量的验证。如:
  2. 给变量年龄一个限制,大于 16 岁,小于 65 岁,这时候就需要使用变量过滤器过滤掉 16 岁和 65 岁以外的数字。
  3. $age = 35;
  4. var_dump(filter_var($age,FILTER_VALIDATE_INT,['options'=>['min_range'=>18,'max_range'=>60]]));
  1. 1.过滤单个变量filter_var()
  2. 2.过滤多个变量filter_var_array()
  3. var_dump(filter_var_array([100,'php'],FILTER_VALIDATE_INT));
  4. 3.检测是否存在指定的外部变量
  5. var_dump(filter_has_var(INPUT_GET,'page'));
  6. echo '<hr>';
  7. echo 'get变量p = ' . $_GET['p'];
  8. (这种访问方式会让我们遭到攻击,所以需要使用外部变量过滤器。)
  9. 4.访问外部变量的过滤器。url中的数据全部都是字符串。
  10. var_dump (filter_input(INPUT_GET,'p',FILTER_VALIDATE_INT,['options'=>['min_range'=>1]]));
  11. echo filter_input(INPUT_GET,'p',FILTER_VALIDATE_INT,['options'=>['min_range'=>1]])? '页码OK':'页码非法';
  12. 5.同时验证多个外部变量:filter_input_arry()
  13. $args = [
  14. 'username' => FILTER_SANITIZE_STRING,
  15. 'email' => FILTER_VALIDATE_EMAIL,
  16. 'age' => ['filter' => FILTER_VALIDATE_INT, 'flags'=>FILTER_REQUIRE_SCALAR, 'options' => ['min_range' => 18]],
  17. 'blog' => FILTER_VALIDATE_URL,
  18. ];
  19. var_dump((filter_input_array(INPUT_GET,$args)));

运行效果:

三、常量

1.常量的特点

  1. PHP常量是一个简单值的标识符。该值在脚本中不能改变。
  2. 一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。
  3. 常量名不需要加 $ 修饰符。
  4. 常量在定义后,默认是全局变量,可以在整个运行的脚本的任何地方使用。
  5. 常量不受作用域限制。

2.常量的定义方式

  1. get_defined_constants(): 查看系统所有常量
  2. defined(): 检测常量是否存在
  3. define(): 创建常量
  4. const: 关键字创建常量
  5. constant(): 获取常量值

举例:

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

运行效果:

3.常用的预定义常量

  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_DI : 默认 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:目录分隔符

4.魔术常量

  1. 魔术常量,是指常量的值, 会随它们在代码中的位置改变而改变,魔术常量也属于"预定义常量",魔术常量不区分大小写, 但是推荐全部大写。
  2. __LINE__:文件中的当前行号
  3. __FILE__:文件的完整路径和文件名
  4. __DIR__:文件所在目录
  5. __FUNCTION__:当前的函数名称
  6. __CLASS__:当前类名称
  7. __TRAIT__:当前`Trait`名称
  8. __METHOD__:当前类方法名称
  9. __NAMESPACE__:当前命名空间名称

举例:

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

运行效果:

四、总结:

1.变量的本质是数据共享。当我们的数据需要在代码中多次出现,为了方便修改和维护数据,我们使用变量实现数据共享,这样在需要修改代码数据时,只需要修改一个数值就可以了,否则需要挨个修改数据,对于上百上千个代码来说,想象一下这简直是程序员的末日。
2.函数的本质是代码共享。其实就是我们学生时代学习的函数与变量。
3.很想对预定义常量说,我记不住呀!
4.魔术常量很友好呦。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议