Blogger Information
Blog 55
fans 3
comment 0
visits 54644
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP变量作用域,常量,变量过滤器
王佳祥
Original
913 people have browsed it

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 — 过滤多个外部变量

Correcting teacher:GuanhuiGuanhui

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