1、变量作用域
- 变量作用域,也叫”变量范围”, 即定义变量时的上下文环境
- 变量作用域,通俗的说,就是变量的生效范围
- 一个变量必定属于一个作用域, 这个作用域也包括了当前作用域中引入其它文件
- 也有不受作用域限制的变量,例如超全局变量, 在程序中任何地方都是有定义的
- 函数作用域: php 中只有函数可以创建作用域, 函数之外的代码全部在全局空间中
序号 |
作用域 |
描述 |
1 |
函数作用域 |
使用function 关键字创建的作用域 |
2 |
全局作用域 |
函数之外的变量生效范围 |
注意
php 中没有块作用域的概念, 这与其它编程语言不同
1.1、 根据作用域不同, 变量可以分为三类:
序号 |
变量类型 |
描述 |
1 |
私有变量 |
函数中定义的变量 |
2 |
全局变量 |
函数之外定义的变量 |
3 |
超全局变量 |
也叫预定义变量,访问不受作用域限制 |
1.2、超全局变量
- 超全局变量,也叫超全局数组,随系统加载,因此在所有脚本中均有定义,全局和函数中都可以访问
序号 |
变量名 |
描述 |
1 |
$GLOBALS |
引用全局作用域中可用的全部变量 |
2 |
$_SERVER |
服务器和执行环境信息 |
3 |
$_GET |
HTTP GET 请求:通过 URL 参数传递给当前脚本的变量的数组 |
4 |
$_POST |
HTTP POST 请求: 将变量以关联数组形式传入当前脚本 |
5 |
$_FILES |
HTTP 文件上传变量,保存着上传文件的全部信息 |
6 |
$_COOKIE |
通过 HTTP Cookies 方式传递给当前脚本的变量的数组 |
7 |
$_SESSION |
当前脚本可用 SESSION 变量的数组 |
8 |
$_REQUEST |
默认情况下包含了 $_GET ,$_POST 和 $_COOKIE 的数组 |
9 |
$_ENV |
通过环境方式传递给当前脚本的变量的数组 |
代码实例
<?php
$siteName = 'php中文网'; // 全局作用域
// 超全局变量不受作用域限制
// print_r($GLOBALS['siteName']);
function getInfo() : string// 声明函数: 同时也创建一个函数作用域
{
// 定义了一个函数"私有变量"
// 1. 方法1: global
global $siteName;//声明变量为global
$private = $siteName;
// 2. 使用超全局变量
$private = $GLOBALS['siteName'];// 函数中可以直接访问超全局变量
echo $_SERVER['SCRIPT_NAME']. '<br>';
return $private;
}
echo getInfo();//调用函数
echo $_SERVER['SCRIPT_NAME']. '<br>';//使用超全局变量输出脚本名称
?>
2、静态变量
2.1、 基本常识
- 定义在函数中的静态变量使用
static
修饰,并且与函数作用域绑定 - 静态变量定义时必须初始化,且只能初始化一次,默认为
0
- 当程序执行离开函数作用域后,静态变量的值不丢失
- 静态变量的值,可以在函数的多次调用中保持不变,即可带入下次调用中
- 函数中静态变量遵循私有变量约束, 全局不可访问
2.2、 应用场景
- 当多次调用同一函数,且要求每次调用之间共享或保留某些变量的时候
- 尽管全局变量也可以办到,但没必要, 采用局部静态变量更合适
代码实例
function test1(): float
{
// 局部静态变量: 只在函数第一次调用的时候被初始化,以后不会再被更新了
// 静态变量,可以理解为在函数中的"伪全局变量"
// 实现函数在多次调用的过程中共享数据
static $sum = 0;//定义局部静态变量
$sum = $sum + 1;
return $sum;
}
echo test1(), '<br>';//输出1
echo test1(), '<br>';//输出2
echo test1(), '<br>';//输出3
echo '<hr>';
?>
注意
- 变量的本质是数据共享
- 函数的本质是代码共享`
3、变量过滤器
代码实例
<?php
//遍历出变量过滤器
// foreach (filter_list() as $filter) {
// echo $filter . ' => ' . filter_id($filter) . '<br>';
// }
// echo '<hr>';
// 1. 过滤单个变量filter_var()
// 年龄
$age = 30;
$age = '30';
$age = 68;
var_dump(filter_var($age, FILTER_VALIDATE_INT,['options'=>['min_range'=>18,'max_range'=>60]]));//判断$age是否满足条件,满足输出值,不满足输出false
echo '<hr>';
$email = 'admin@php.cn';
$email = 'admin@';
var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));//判断$email是否满足条件,满足输出值,不满足输出false
var_dump(filter_var($email, 274));
echo '<hr>';
// 2. 过滤单个变量filter_var_array()
var_dump(filter_var_array([100, 'php'], FILTER_VALIDATE_INT));//判断多个值是否满足条件,满足输出值,不满足输出false
echo '<hr>';
// 3. 检测是否存在指定的外部变量, filter_has_var()
// 对于URL中的查询字符串: 在URL地址?后面的键值对
// php.cn/index.php?
// id=10
// name=admin
// INPUT_GET: 表示要检测的是$_GET,就是get参数,其实就是get请求
// INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV
var_dump(filter_has_var(INPUT_GET, 'page'));
echo '<hr>';
echo 'get变量p = ' . $_GET['p'];
echo '<hr>';
// 4. 访问外部变量的过滤器,filter_input
var_dump(filter_input(INPUT_GET, 'p',FILTER_VALIDATE_INT, ['options'=>['min_range'=>1]]));
// echo filter_input(INPUT_GET, 'p',FILTER_VALIDATE_INT, ['options'=>['min_range'=>1]]) ? '页码OK': '页码非法';
// 5. 同时验证多个外部变量: filter_input_array()
echo '<hr>';
$args = [
'username' => FILTER_SANITIZE_STRING,
'email' => FILTER_VALIDATE_EMAIL,
'age' => ['filter' => FILTER_VALIDATE_INT, 'flags'=>FILTER_REQUIRE_SCALAR, 'options' => ['min_range' => 18]],
'blog' => FILTER_VALIDATE_URL,
];
// 标量:单值变量, 字符串, 布尔, 数值,
// 复合: 对象, 数组
var_dump(filter_input_array(INPUT_GET, $args));
4、常量
- 常量是代码中不需要更新的数据
- 一个常量由英文字母、下划线、和数字组成,但数字不能放在最前面
- 常量名不需要加 $ 修饰符
<?php
print_r(get_defined_constants());// 查看一下当前系统中有哪些常量
?>
4.1、定义常量
- define()函数
- const 关键字
- 常量不受作用域限制
- const不能用在函数中
- 流程控制中,define能用, const不能用
- const用在类中,创建类常量
注意
- 常量通常只允许用标量进行初始化
- 标量: 单值变量, 字符串, 数值,布尔, null
4.1、魔术常量
序号 |
名称 |
描述 |
1 |
LINE |
文件中的当前行号 |
2 |
FILE |
文件的完整路径和文件名 |
3 |
DIR |
文件所在的目录 |
4 |
FUNCTION |
函数名称 |
5 |
CLASS |
类名称 |
6 |
METHOD |
类方法 |
学习总结
本节课我们继续学习了变量以及常量的知识,通过本节课的学习使我知道了一个新的知识点变量过滤器,学习了如何查询变量过滤器以及变量过滤器的使用语法,对一些以前了解的知识进行了加固和补充,对知识点的理解更加透彻,清晰。