博客列表 >PHP变量作用域,常量,变量过滤器

PHP变量作用域,常量,变量过滤器

王佳祥
王佳祥原创
2020年07月04日 11:14:01912浏览

PHP变量作用域,常量,变量过滤器

一、PHP变量作用域

1.基本概念

  • 作用域是变量的生效范围

  • 作用域是查找变量的工具

  • 全局作用域:写到了函数外部的变量

  • 函数作用域:写到了函数内部的变量,函数会创建一个独立的作用域,不能直接访问外部的变量

  1. <?php
  2. error_reporting(E_ALL);//显示错误警告
  3. //作用域是变量的生效范围
  4. //作用域是查找变量的工具
  5. //1.全局作用域:写到了函数外部的变量
  6. $siteName='php中文网';
  7. //2.函数作用域:
  8. function getInfo(){
  9. //访问函数外部的变量(全局变量)
  10. //在php,函数会创建出一个独立的作用域,不能直接访问外部的变量
  11. return $siteName;
  12. }
  13. echo getInfo();


2.如何通过函数内部访问函数外部的变量?

  • 用global关键字
  1. <?php
  2. error_reporting(E_ALL);//显示错误警告
  3. //作用域是变量的生效范围
  4. //作用域是查找变量的工具
  5. //1.全局作用域:写到了函数外部的变量
  6. $siteName='php中文网';
  7. //2.函数作用域:
  8. function getInfo(){
  9. //访问函数外部的变量(全局变量)
  10. //在php,函数会创建出一个独立的作用域,不能直接访问外部的变量
  11. //1.在函数中做一个声明
  12. global $siteName;
  13. return $siteName;
  14. //私有变量
  15. /* $local = 'hello php.cn';
  16. return $local; */
  17. }
  18. echo getInfo();


  • 使用 $GLOBALS 替代 global,$GLOBALS 是一个关联数组,每一个变量为一个元素,键名对应变量名,值对应变量的内容。$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个超全局变量。
  1. <?php
  2. error_reporting(E_ALL);
  3. $siteName='$GLOBALS超全局变量';
  4. function getInfo(){
  5. return $GLOBALS['siteName'];
  6. }
  7. echo getInfo();


  • 在全局中创建的变量,会自动成为超全局数组$GLOBALS中的一个元素,不受作用域限制
  1. <?php
  2. $siteName='$GLOBALS超全局变量';
  3. echo '<pre>'.print_r($GLOBALS,true).'<pre>';
  4. //在全局中创建的变量,会自动成为超全局数组$GLOBALS中的一个元素


  • 超全局变量$_SEVER[‘SCRIPT_NAME’],$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组;’SCRIPT_NAME’包含当前脚本的路径
  1. <?php
  2. echo $_SERVER['SCRIPT_NAME'];//包含当前脚本的路径
  3. echo $_SERVER['SCRIPT_FILENAME'];//当前执行脚本的绝对路径
  4. echo $_SERVER['REMOTE_ADDR'];//浏览当前页面的用户的 IP 地址
  5. echo $_SERVER['REMOTE_HOST'];//当前运行脚本所在的文档根目录


二、PHP常量

1.基本概念

  • 常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变(除了所谓的魔术常量,它们其实不是常量)。常量默认为大小写敏感。传统上常量标识符总是大写的。

  • 合法的常量名以字母或下划线开始,后面跟着任何字母,数字或下划线。

2. 定义常量

  • 可以用 define() 函数来定义常量,在 PHP 5.3.0 以后,可以使用 const 关键字在类定义之外定义常量。一个常量一旦被定义,就不能再改变或者取消定义。

  • 常量只能包含标量数据(boolean,integer,float 和 string)。

  • 常量和变量有如下不同:

    常量前面没有美元符号($);
    常量只能用 define() 函数定义,而不能通过赋值语句;
    常量可以不用理会变量的作用域而在任何地方定义和访问;
    常量一旦定义就不能被重新定义或者取消定义;
    常量的值只能是标量。

  • 使用 const 关键字定义常量必须处于最顶端的作用区域,因为用此方法是在编译时定义的。这就意味着不能在函数内,循环内以及 if 语句之内用 const 来定义常量。

  1. <?php
  2. //查看当前有哪些可用的常量
  3. print_r(get_defined_constants(true));


  1. <?php
  2. //查看当前有哪些可用的常量
  3. //print_r(get_defined_constants(true));
  4. //查询用户自定义常量
  5. //两种方式创建常量
  6. //关键字const
  7. const APP_PATH = '/WEB';
  8. //函数define
  9. define('APP_NAME','客户管理系统');
  10. //查询用户自定义的常量
  11. print_r(get_defined_constants(true)['user']);


  • 常量必须初始化,并且不让删除
  1. <?php
  2. const APP_PATH;
  3. //函数define
  4. define('APP_NAME','客户管理系统');
  5. //查询用户自定义的常量
  6. print_r(get_defined_constants(true)['user']);


  1. <?php
  2. const APP_PATH = '客户管理系统';
  3. $name = 'APP_PATH';
  4. echo $name.'<br>';
  5. echo constant($name).'<br>';//要访问到常量的值必须用constant()
  6. //定义一个特殊的常量
  7. define('','admin@php.cn');
  8. echo '';
  9. echo constant('');


  • 预定义常量
  1. <?php
  2. //预定义常量
  3. echo '版本号:' . PHP_VERSION . '<br>';
  4. echo '操作系统:' . PHP_OS_FAMILY . '<br>';
  5. echo '最大整数:' . PHP_INT_MAX . '<br>';
  6. echo '最大浮点数:' . PHP_FLOAT_MAX . '<br>';
  7. echo '目录分隔符:' . DIRECTORY_SEPARATOR . '<br>';


  • 魔术常量
  1. <?php
  2. echo '当前行号:' . __LINE__ . '<br>';
  3. echo '当前文件:' . __FILE__ . '<br>';
  4. echo '当前目录:' . __DIR__ . '<br>';


  • 常量的命名空间
  1. <?php
  2. //error_reporting(E_ALL);
  3. //全局空间中的成员,不允许重复定义
  4. //const APP_PATH = '/phpstudy_pro';
  5. //const APP_PATH = '/public';
  6. //其实类与函数也是全局成员,也不允许重复定义
  7. //全局成员:常量,类,函数,接口
  8. namespace ns1{
  9. const APP_PATH = '/WEB';
  10. }
  11. namespace ns2{
  12. const APP_PATH = '/public';
  13. }
  14. namespace{
  15. echo \ns1\APP_PATH,"<br>";
  16. echo \ns2\APP_PATH,"<br>";
  17. }
  18. //命名空间:解决了全局成员的命名冲突问题


三、PHP变量过滤器

1.查看当前系统支持的过滤器

  1. <?php
  2. //变量过滤器
  3. foreach(filter_list() as $filter){
  4. echo $filter . ' => ' . filter_id($filter) . '<br>';
  5. }


2. 验证单个变量

  1. <?php
  2. //1.过滤单个变量filter_var()
  3. $age = 80;
  4. //filter_var(要过滤的变量,过滤器常量)
  5. $options = ['options' => ['min-range' => 18,'max_range' => 60]];
  6. var_dump(filter_var($age,FILTER_VALIDATE_INT,$options));
  7. echo '<hr>';
  8. $email = 'admin@php.cn';
  9. //var_dump(filter_var($email,FILTER_VALIDATE_EMAIL));
  10. var_dump(filter_var($email,274));


3. 验证多个变量

  1. <?php
  2. //验证多个变量filter_var_array()
  3. $a = 10;
  4. $b ='php';
  5. $arr = [$a,$b];
  6. var_dump(filter_var_array($arr,FILTER_VALIDATE_INT));


4.验证外部变量

  1. //外部变量
  2. //通常通过http请求发送过来的,表单,get,post
  3. //使用GET参数演示外部变量的获取与验证/过滤
  4. //filter_input(输入类型get/post,变量名,过滤器,参数)
  5. echo 'id = ' .$_GET['id'];
  6. $options = ['options' => ['min_range' => 1]];
  7. var_dump(filter_input(INPUT_GET,'id',FILTER_VALIDATE_INT,$options));
  8. //同时验证多个外部变量
  9. $args = [
  10. 'username' => FILTER_SANITIZE_STRING,
  11. 'email' => FILTER_VALIDATE_EMAIL,
  12. 'age' => ['filter' => FILTER_VALIDATE_INT,'options' => ['min_range'=>18,'max_range'=>60]],
  13. 'blog' => FILTER_VALIDATE_URL
  14. ];
  15. var_dump(filter_input_array(INPUT_GET,$args));


学习总结

1.变量作用域:

  • 全局作用域,函数作用域

  • 函数作用域通过global,$GLOBALS来访问外部变量

  • 超全局变量

$_SERVER[] 包含了诸如头信息(header)、路径(path)、以及脚本位置的数组
‘PHP_SELF’ 当前执行脚本的文件名
‘GATEWAY_INTERFACE’ 服务器使用的 CGI 规范的版本
‘SERVER_ADDR’ 当前运行脚本所在的服务器的 IP 地址
‘SERVER_NAME’ 当前运行脚本所在的服务器的主机名
‘SERVER_SOFTWARE’ 服务器标识字符串,在响应请求时的头信息中给出
‘SERVER_PROTOCOL’ 请求页面时通信协议的名称和版本
‘REQUEST_METHOD’ 访问页面使用的请求方法
‘REQUEST_TIME’ 请求开始时的时间戳
‘REQUEST_TIME_FLOAT’ 请求开始时的时间戳,微秒级别的精准度
‘QUERY_STRING’ 查询字符串
‘DOCUMENT_ROOT’ 当前运行脚本所在的文档根目录
‘HTTP_ACCEPT’ 当前请求头中 Accept: 项的内容
‘HTTP_ACCEPT_CHARSET’ 当前请求头中 Accept-Charset: 项的内容
‘REMOTE_ADDR’ 浏览当前页面的用户的 IP 地址
‘REMOTE_HOST’ 浏览当前页面的用户的主机名
‘REMOTE_PORT’ 用户机器上连接到 Web 服务器所使用的端口号
‘REMOTE_USER’ 经验证的用户
‘SCRIPT_FILENAME’ 当前执行脚本的绝对路径。

2.常量

  • 常量通常是大写的,单词之间用下划线连接

  • 一个常量一旦被定义,就不能再改变或者取消定义

  • 定义常量用const关键字和define()函数

  • const用于类成员变量定义

  • const不能在条件语句中定义常量

  • 使用const简单易读,它本身是一个语言结构,而define是一个方法,用const定义在编译时比define快很多

  • define不能定义在类中,而const必须定义在类中,并且const定义的变量必须通过类名::变量名来进行访问

  • define定义全局常量,在任何地方都可以访问

  • 常量可以不用理会变量的作用域而在任何地方定义和访问;

  • 预定义常量

预定义常量 释义
PHP_VERSION 当前 PHP 的版本号
PHP_OS 当前的操作系统名称
PHP_EOL 系统换行符,Windows 是(\r\n),Linux 是(\n),MAC 是(\r)
PHP_INT_MAX 当前 PHP 支持的最大整数
PHP_INT_MIN 当前 PHP 支持的最小整数
PHP_EXTENSION_DIR PHP 的扩展目录
TRUE 布尔类型的 true
FALSE 布尔类型的 false
NULL Null 值
  • 魔术常量
魔术常量 释义
LINE 文件中的当前行号;
FILE 当前文件的绝对路径(包含文件名);
DIR 当前文件的绝对路径(不包含文件名),等价于 dirname(FILE);
FUNCTION 当前函数(或方法)的名称;
CLASS 当前的类名(包括该类的作用区域或命名空间);
TRAIT 当前的 trait 名称(包括该 trait 的作用区域或命名空间);
METHOD 当前的方法名(包括类名);
NAMESPACE 当前文件的命名空间的名称。

3.变量过滤器

  • filter_var(要过滤的变量,过滤器常量),过滤一个变量

  • filter_var_array 过滤多个变量

  • filter_input(输入类型get/post,变量名,过滤器,参数) 过滤单个外部变量

  • filter_input_array — 过滤多个外部变量

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议