变量作用域
- 超全局变量不需要定义,不需要初始化
- 超全局变量不受作用域限制
- 函数作用域: php 中只有函数可以创建作用域, 函数之外的代码全部在全局空间中
序号 | 作用域 | 描述 |
---|---|---|
1 | 函数作用域 | 使用function 关键字创建的作用域 |
2 | 全局作用域 | 函数之外的变量生效范围 |
- 根据作用域不同, 变量可以分为三类:
序号 | 变量类型 | 描述 |
---|---|---|
1 | 私有变量 | 函数中定义的变量 |
2 | 全局变量 | 函数之外定义的变量 |
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 |
通过环境方式传递给当前脚本的变量的数组 |
静态变量
变量的本质是数据共享
函数的本质是代码共享
namespace ns1;
// 命名空间:可以理解为文件目录(文件夹)
function test1(): float
{
// 私有变量,也叫动态变量,在函数中每一次都会自动初始化
// 并且无法在多次调用过程中保持不变
$sum = 0;
$sum = $sum + 1;
return $sum;
}
echo test1(), '<br>';
echo test1(), '<br>';
echo test1(), '<br>';
echo '<hr>';
// 不推荐使用这种方法
namespace ns2;
// 全局变量
$sum = 0;
function test1(): float
{
global $sum;
$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>';
变量过滤器
查看系统支持的过滤器
foreach (filter_list() as $filter) {
echo $filter . ' => ' . filter_id($filter) . '<br>';
}
过滤实例
// 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 = 'admin@php.cn';
$email = 'admin@';
var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
// 支持直接使用过滤器的ID
var_dump(filter_var($email, 274));
echo '<hr>';
// 2. 过滤多个变量filter_var_array()
var_dump(filter_var_array([100, 'php'], FILTER_VALIDATE_INT));
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': '页码非法';
echo '<hr>';
// 5. 同时验证多个外部变量: filter_input_array()
$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));
常量
常量是代码中不需要更新的数据
// 查看一下当前系统中有哪些常量
// print_r(get_defined_constants());
// 分组查看
// print_r(get_defined_constants(true));
1.1 常量的特征
序号 | 特征 |
---|---|
1 | 常量前面没有美元符号$ |
2 | 常量创建时必须初始化 |
3 | 常量禁止更新和删除 |
4 | 常量不受作用域限制 |
5 | 推荐使用大写字母加下划线命名 |
1.3 定义常量
- define()函数定义
define('LECTURE', '朱老师');
- const 关键字定义
const COURSE = 'PHP';
1.4 常量的作用域
- define 可以在函数中使用
- const 不能在函数中使用
// 常量不受作用域限制,可以直接在函数中访问
function test1()
{
echo LECTURE . '教: ' . COURSE . '<br>';
// define可以在函数中使用
define('SEX', '男');
echo SEX . '<br>';
// const不能用在函数中
// const AGE = 30;
// echo AGE;
}
test1();
- 流程控制中,define 能使用, const 不能使用
// 流程控制中,define能用, const不能用
if (true) {
define('EMAIL', 'admin@php.cn');
// const EMAIL = 'admin@php.cn';
// echo EMAIL;
}
- const 可以用在类中,创建类常量
- define 不可以用在类中
class Demo
{
const HELLO = 'php.cn';
// define('A', 100);
}
echo Demo::HELLO.'<br>';
// echo Demo::A.'<br>';
1.5 常量的初始化
- 常量通常只允许用标量进行初始化
- 标量: 单值变量, 字符串, 数值,布尔, null
- php7.0+支持数组初始化常量
const DB_LINKS = [
'host'=>'localhost',
'username'=>'root',
'password'=>'root',
'charset'=>'utf8',
];
echo '<pre>'.print_r(DB_LINKS,true).'</pre>';
1.6 函数/关键字
序号 | 定义方式 | 描述 |
---|---|---|
1 | get_defined_constants() |
查看系统所有常量 |
2 | defined() |
检测常量是否存在 |
3 | define() |
创建常量 |
4 | const 关键字 |
创建常量 |
5 | constant() |
获取常量值 |
get_defined_constants(true)
: 常量分组打印,自定义常量在user
分组defined()
: 返回布尔值
1.7 常量的打印
constant()
1.8 预定义常量
预定义常量非常多,有许多与具体扩展相关,如 PDO
, 这里仅列出系统级常用的:
序号 | 预定义常量 | 描述 |
---|---|---|
1 | PHP_VERSION |
PHP 版本 |
2 | PHP_MAXPATHLEN |
PHP 路径最大长度:1024 |
3 | PHP_OS_FAMILY |
操作系统:Windows/Darwin/Linux |
4 | PHP_SAPI |
web 服务器与 php 之间接口: apache2handler |
5 | PHP_EOL |
行尾结束符 |
6 | PHP_INT_MAX |
最大整数: 9223372036854775807 |
7 | PHP_INT_MIN |
最小整数: -9223372036854775808 |
8 | PHP_INT_SIZE |
整数宽度: 8 |
9 | PHP_FLOAT_MAX |
最大浮点数:1.7976931348623E+308 |
10 | PHP_FLOAT_MIN |
整小浮点数: 2.2250738585072E-308 |
11 | DEFAULT_INCLUDE_PATH |
默认 PHP 命令路径 |
12 | PHP_EXTENSION_DIR |
默认 PHP 扩展路径 |
13 | E_ERROR |
运行时错误: 致命中断 |
14 | E_PARSE |
语法解析错误: 致命中断 |
15 | E_NOTICE |
运行时提示: 不中断 |
16 | E_WARNING |
运行时警告: 不中断 |
17 | E_ALL |
所有级别错误(除E_STRICT ) |
18 | E_STRICT |
更加严格的错误处理机制,高于E_ALL |
19 | TRUE |
布尔真 |
20 | FALSE |
布尔假 |
21 | NULL |
空 |
22 | DIRECTORY_SEPARATOR |
目录分隔符 |
更多预定义常量:https://www.php.net/manual/zh/reserved.constants.php
1.9 魔术常量
- 魔术常量也属于”预定义常量”, 比较特殊所有单独列出
- 所谓”魔术”, 是指常量的值, 会随它们在代码中的位置改变而改变
- 魔术常量不区分大小写, 但是推荐全部大写
序号 | 魔术常量 | 描述 |
---|---|---|
1 | __LINE__ |
文件中的当前行号 |
2 | __FILE__ |
文件的完整路径和文件名 |
3 | __DIR__ |
文件所在目录 |
4 | __FUNCTION__ |
当前的函数名称 |
5 | __CLASS__ |
当前类名称 |
6 | __TRAIT__ |
当前Trait 名称 |
7 | __METHOD__ |
当前类方法名称 |
8 | __NAMESPACE__ |
当前命名空间名称 |
1.9.1 魔术常量的使用
- 直接使用
echo '当前行号: ' . __LINE__ . '<br>';
echo '当前文件: ' . __FILE__ . '<br>';
echo '当前目录: ' . __DIR__ . '<br>';
- 在函数中在使用
function hello123()
{
echo __FUNCTION__;
}
hello123();
- 在类中在使用
class D
{
public function index()
{
echo __METHOD__;
}
}
(new D)->index();