PHP变量作用域,常量,变量过滤器
一、PHP变量作用域
1.基本概念
作用域是变量的生效范围
作用域是查找变量的工具
全局作用域:写到了函数外部的变量
函数作用域:写到了函数内部的变量,函数会创建一个独立的作用域,不能直接访问外部的变量
<?php
error_reporting(E_ALL);//显示错误警告
//作用域是变量的生效范围
//作用域是查找变量的工具
//1.全局作用域:写到了函数外部的变量
$siteName='php中文网';
//2.函数作用域:
function getInfo(){
//访问函数外部的变量(全局变量)
//在php,函数会创建出一个独立的作用域,不能直接访问外部的变量
return $siteName;
}
echo getInfo();
2.如何通过函数内部访问函数外部的变量?
- 用global关键字
<?php
error_reporting(E_ALL);//显示错误警告
//作用域是变量的生效范围
//作用域是查找变量的工具
//1.全局作用域:写到了函数外部的变量
$siteName='php中文网';
//2.函数作用域:
function getInfo(){
//访问函数外部的变量(全局变量)
//在php,函数会创建出一个独立的作用域,不能直接访问外部的变量
//1.在函数中做一个声明
global $siteName;
return $siteName;
//私有变量
/* $local = 'hello php.cn';
return $local; */
}
echo getInfo();
- 使用 $GLOBALS 替代 global,$GLOBALS 是一个关联数组,每一个变量为一个元素,键名对应变量名,值对应变量的内容。$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个超全局变量。
<?php
error_reporting(E_ALL);
$siteName='$GLOBALS超全局变量';
function getInfo(){
return $GLOBALS['siteName'];
}
echo getInfo();
- 在全局中创建的变量,会自动成为超全局数组$GLOBALS中的一个元素,不受作用域限制
<?php
$siteName='$GLOBALS超全局变量';
echo '<pre>'.print_r($GLOBALS,true).'<pre>';
//在全局中创建的变量,会自动成为超全局数组$GLOBALS中的一个元素
- 超全局变量$_SEVER[‘SCRIPT_NAME’],$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组;’SCRIPT_NAME’包含当前脚本的路径
<?php
echo $_SERVER['SCRIPT_NAME'];//包含当前脚本的路径
echo $_SERVER['SCRIPT_FILENAME'];//当前执行脚本的绝对路径
echo $_SERVER['REMOTE_ADDR'];//浏览当前页面的用户的 IP 地址
echo $_SERVER['REMOTE_HOST'];//当前运行脚本所在的文档根目录
二、PHP常量
1.基本概念
常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变(除了所谓的魔术常量,它们其实不是常量)。常量默认为大小写敏感。传统上常量标识符总是大写的。
合法的常量名以字母或下划线开始,后面跟着任何字母,数字或下划线。
2. 定义常量
可以用 define() 函数来定义常量,在 PHP 5.3.0 以后,可以使用 const 关键字在类定义之外定义常量。一个常量一旦被定义,就不能再改变或者取消定义。
常量只能包含标量数据(boolean,integer,float 和 string)。
常量和变量有如下不同:
常量前面没有美元符号($);
常量只能用 define() 函数定义,而不能通过赋值语句;
常量可以不用理会变量的作用域而在任何地方定义和访问;
常量一旦定义就不能被重新定义或者取消定义;
常量的值只能是标量。使用 const 关键字定义常量必须处于最顶端的作用区域,因为用此方法是在编译时定义的。这就意味着不能在函数内,循环内以及 if 语句之内用 const 来定义常量。
<?php
//查看当前有哪些可用的常量
print_r(get_defined_constants(true));
<?php
//查看当前有哪些可用的常量
//print_r(get_defined_constants(true));
//查询用户自定义常量
//两种方式创建常量
//关键字const
const APP_PATH = '/WEB';
//函数define
define('APP_NAME','客户管理系统');
//查询用户自定义的常量
print_r(get_defined_constants(true)['user']);
- 常量必须初始化,并且不让删除
<?php
const APP_PATH;
//函数define
define('APP_NAME','客户管理系统');
//查询用户自定义的常量
print_r(get_defined_constants(true)['user']);
<?php
const APP_PATH = '客户管理系统';
$name = 'APP_PATH';
echo $name.'<br>';
echo constant($name).'<br>';//要访问到常量的值必须用constant()
//定义一个特殊的常量
define('','admin@php.cn');
echo '';
echo constant('');
- 预定义常量
<?php
//预定义常量
echo '版本号:' . PHP_VERSION . '<br>';
echo '操作系统:' . PHP_OS_FAMILY . '<br>';
echo '最大整数:' . PHP_INT_MAX . '<br>';
echo '最大浮点数:' . PHP_FLOAT_MAX . '<br>';
echo '目录分隔符:' . DIRECTORY_SEPARATOR . '<br>';
- 魔术常量
<?php
echo '当前行号:' . __LINE__ . '<br>';
echo '当前文件:' . __FILE__ . '<br>';
echo '当前目录:' . __DIR__ . '<br>';
- 常量的命名空间
<?php
//error_reporting(E_ALL);
//全局空间中的成员,不允许重复定义
//const APP_PATH = '/phpstudy_pro';
//const APP_PATH = '/public';
//其实类与函数也是全局成员,也不允许重复定义
//全局成员:常量,类,函数,接口
namespace ns1{
const APP_PATH = '/WEB';
}
namespace ns2{
const APP_PATH = '/public';
}
namespace{
echo \ns1\APP_PATH,"<br>";
echo \ns2\APP_PATH,"<br>";
}
//命名空间:解决了全局成员的命名冲突问题
三、PHP变量过滤器
1.查看当前系统支持的过滤器
<?php
//变量过滤器
foreach(filter_list() as $filter){
echo $filter . ' => ' . filter_id($filter) . '<br>';
}
2. 验证单个变量
<?php
//1.过滤单个变量filter_var()
$age = 80;
//filter_var(要过滤的变量,过滤器常量)
$options = ['options' => ['min-range' => 18,'max_range' => 60]];
var_dump(filter_var($age,FILTER_VALIDATE_INT,$options));
echo '<hr>';
$email = 'admin@php.cn';
//var_dump(filter_var($email,FILTER_VALIDATE_EMAIL));
var_dump(filter_var($email,274));
3. 验证多个变量
<?php
//验证多个变量filter_var_array()
$a = 10;
$b ='php';
$arr = [$a,$b];
var_dump(filter_var_array($arr,FILTER_VALIDATE_INT));
4.验证外部变量
//外部变量
//通常通过http请求发送过来的,表单,get,post
//使用GET参数演示外部变量的获取与验证/过滤
//filter_input(输入类型get/post,变量名,过滤器,参数)
echo 'id = ' .$_GET['id'];
$options = ['options' => ['min_range' => 1]];
var_dump(filter_input(INPUT_GET,'id',FILTER_VALIDATE_INT,$options));
//同时验证多个外部变量
$args = [
'username' => FILTER_SANITIZE_STRING,
'email' => FILTER_VALIDATE_EMAIL,
'age' => ['filter' => FILTER_VALIDATE_INT,'options' => ['min_range'=>18,'max_range'=>60]],
'blog' => FILTER_VALIDATE_URL
];
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 — 过滤多个外部变量