一、变量和常量基础知识
1.变量作用域:php 中没有块作用域
序号 |
作用域 |
描述 |
1 |
函数作用域 |
使用function 关键字创建的作用域 |
2 |
全局作用域 |
函数之外的变量生效范围 |
2.根据变量作用域分类变量
序号 |
变量类型 |
描述 |
1 |
私有变量 |
函数中定义的变量 |
2 |
全局变量 |
函数之外定义的变量 |
3 |
超全局变量 |
也叫预定义变量,访问不受作用域限制 |
3.超全局变量
序号 |
变量名 |
描述 |
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 |
通过环境方式传递给当前脚本的变量的数组 |
4.静态变量
- 4.1 定义在函数中的静态变量使用
static
修饰,并且与函数作用域绑定 - 4.2 静态变量定义时必须初始化,且只能初始化一次,默认为
0
- 4.3 当程序执行离开函数作用域后,静态变量的值不丢失
- 4.4 静态变量的值,可以在函数的多次调用中保持不变,即可带入下次调用中
- 4.5 函数中静态变量遵循私有变量约束, 全局不可访问
5.变量过滤器
5.1 查看所有变量过滤器
foreach (filter_list() as $filter) {
echo $filter . ' => ' . filter_id($filter) . '<br>';
}
5.2 常用过滤器
- 1.
filter_has_var
(类型,变量), 检测是否存在指定类型的变量
,只检查动态提交数据 - 2.
INPUT_GET
:GET 方式提交 - 3.
INPUT_POST
:POST 方式提交 - 4.
INPUT_SERVER
:服务器变量 - 5.
INPUT_COOKIE
:cookie - 6.
INPUT_GET
:GET 方式提交 - 7.
INPUT_POST
:POST 方式提交 - 8.
INPUT_SERVER
:服务器变量 - 9.
INPUT_COOKIE
:cookie
6、常量
1.定义常量:define
函数,const
关键字—类专用
2.魔术常量:根据调用场景不同值会变的常量
序号 |
魔术常量 |
描述 |
1 |
__LINE__ |
文件中的当前行号 |
2 |
__FILE__ |
文件的完整路径和文件名 |
3 |
__DIR__ |
文件所在目录 |
4 |
__FUNCTION__ |
当前的函数名称 |
5 |
__CLASS__ |
当前类名称 |
6 |
__TRAIT__ |
当前Trait 名称 |
7 |
__METHOD__ |
当前类方法名称 |
8 |
__NAMESPACE__ |
当前命名空间名称 |
二、代码演示
1.变量作用域
<?php
// 全局作用域
$userName = 'dashu';
// $GlOBALS:超全局变量数组
// 全局变量会自动注册成为$GlOBALS的一个值
//print_r($GLOBALS);
// 声明函数: 同时也创建一个函数作用域
function getInfo() : string
{
// 定义了一个函数"私有变量"
// 1. 方法1: global
// global $userName;
// 2. 使用超全局变量数组
$private = $GLOBALS['userName'];
// 超全局变量不受作用域限制
// SCRIPT_NAME: 当前脚本名称
echo $_SERVER['SCRIPT_NAME']. '<br>';
return $private;
}
echo getInfo() . '<br>';
echo $_SERVER['SCRIPT_NAME']. '<br>';
2.静态变量
<?php
// 静态变量
namespace ns1;
function test1(): float
{
// 私有变量,也叫动态变量,在函数中每一次都会自动初始化
// 并且无法在多次调用过程中保持不变
$sum = 0;
$sum = $sum + 1;
return $sum;
}
echo test1(), '<br>';
echo test1(), '<br>';
echo test1(), '<br>';
echo '<hr>';
namespace ns3;
function test1(): float
{
// 局部静态变量: 只在函数第一次调用的时候被初始化,以后不会再被更新了
// 静态变量,可以理解为在函数中的"伪全局变量"
// 实现函数在多次调用的过程中共享数据
static $sum = 0;
$sum = $sum + 1;
return $sum;
}
echo test1(), '<br>';
echo test1(), '<br>';
echo test1(), '<br>';
echo '<hr>';
$num1 = 20;
// 变量的本质是数据共享,数据复用
// 函数的本质是代码共享,代码复用
echo $num1 + 40;
echo '<br>';
echo $num1 + 20;
echo '<br>';
echo $num1 + 90;
3.变量过滤器:通过返回变量,不通过返回false
<?php
// 变量过滤器:通过返回变量,不通过返回false
//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]]));
echo '<hr>';
// 过滤邮箱
$email = 'zhangsan@qq.com';
$email = 'zhangsan@';
var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
// 274邮箱过滤器编号
var_dump(filter_var($email, 274));
echo '<hr>';
// 2. 过滤多个变量filter_var_array()
var_dump(filter_var_array([88, 'dashu'], FILTER_VALIDATE_INT));
echo '<hr>';
// 3. 检测是否存在指定的外部变量--URL中的查询字符串, filter_has_var()
// 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,
];
// 标量:单值变量, 字符串, 布尔, 数值,
// 复合: 对象, 数组
// http://php.io/0416/demo3.php?p=3&username=dashu&email=dashu@qq.com&age=30&blog=php.cn
var_dump(filter_input_array(INPUT_GET, $args));
三、总结
1.php只有函数会创建作用域,global
和$GlOBALS
,跨作用域访问。
2.static
修饰的变量相当于函数内的全局变量,减少全局变量的占用。
3.变量过滤器强行记忆,重点掌握,很有用。