Blogger Information
Blog 43
fans 1
comment 0
visits 33821
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP变量与常量
蔚蓝世纪
Original
768 people have browsed it

一、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.魔术常量很友好呦。
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
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!