1.变量作用域
作用域的意义:
- 作用域是变量的生效范围;
- 作用域是查找变量的工具。
在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问:
<?php
$x=5; // 全局变量
function getInfo()
{
$y=10; // 局部变量
echo "<p>测试变量在函数内部:<p>";
echo "变量 x 为: $x";
echo "<br>";
echo "变量 y 为: $y";
}
getInfo();
echo "<p>测试变量在函数外部:<p>";
echo "变量 x 为: $x";
echo "<br>";
echo "变量 y 为: $y";
?>
在函数中不能直接访问全局变量,要用global声明或者用超全局变量$GLOBALS来访问
<?php
// 全局作用域
$name = 'll';
// 全局变量自动成为超全局数组$GLOBALS中的元素
echo '<pre>' . print_r($GLOBALS, true) . '</pre>';
echo $GLOBALS['name'];
echo '<hr>';
// 函数作用域
function getInfo()
{
// return $myname;
// 在函数中不能直接访问全局变量,要用global声明或者用超全局变量$GLOBALS来访问
// 1.global声明
// global $name;
// return $name;
// 2.超全局变量$GLOBALS访问
return $GLOBALS['name'];
}
echo getInfo();
2.常量的定义,访问与命名空间
定义常量注意事项:
常量前没有$
常量必须初始化(定义时赋值)
常量不能删除(如 unset )
常量不受作用域限制
常量推荐全部大写,多个单词之间使用下划线连接
类常量只允许用const(不能使用 define())
<?php
// 查看当前系统常量
print_r(get_defined_constants(true));
// 自定义常量,两种方式:const、define()。
const MY_NAME = 'lake';
define('MY_AGE', 18);
// 只查看自定义常量,相当于只看系统常量数组中的一个元素
print_r(get_defined_constants(true)['user']);
// 类中的常量只允许用const定义,用define()会报错
class People
{
const NAME = 'lake';
}
echo '<br>';
// 如果常量名放在一个变量中,用constent()输出常量的值
$name = 'MY_NAME';
echo constant($name);
echo '<br>';
// null也可以用作常量名,但要用constant()获取值
define('', '男');
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 . '<hr>';
// 魔术常量:值随系统变化而变化,无法自定义
echo '当前文件完整路径: ' . __FILE__ . '<br>';
echo '当前文件所在目录: ' . __DIR__ . '<br>';
echo '当前行号: ' . __LINE__ . '<br>';
echo '当函数名: ' . __FUNCTION__ . '<br>';
echo '当前类名: ' . __CLASS__ . '<br>';
echo '当前trait名: ' . __TRAIT__ . '<br>';
echo '当前类方法名: ' . __METHOD__ . '<br>';
echo '当前命名空间: ' . __NAMESPACE__ . '<br>'
命名空间
- 类、函数、接口、常量都是全局成员,不允许重复定义。解决全局成员的命名冲突问题。
<?php
// 命名空间
namespace name1 {
const MY_NAME = 'are';
}
namespace name2 {
const MY_NAME = 'lake';
}
// 全局空间,默认空间没有名称
namespace {
echo name1\MY_NAME;
echo '<br>';
echo name2\MY_NAME;
}
3.过滤器
- 过滤器部分示例
<?php
// 查看当前php版本支持的过滤器
// foreach (filter_list() as $filter) {
// echo $filter . ' => ' . filter_id($filter) . '<br>';
// }
// echo '<hr>';
// 1.单个变量过滤:filter_var(变量名, 过滤器常量)
// $age = 18;
// var_dump(filter_var($age, FILTER_VALIDATE_INT));
// echo '<hr>';
// 2.多个变量过滤:filter_var_array()
// $name = 'lake';
// $age = 10;
// $sex = '男';
// 将变量放到一个数组中
// $people = ['name' => 'lake', 'age' => 10, 'sex' => '男'];
// var_dump(filter_var_array($people, FILTER_VALIDATE_INT));
// echo '<br>';
// var_dump(filter_var_array($people, 513));
// echo '<hr>';
// 3.外部变量过滤:filter_input(输入类型, 变量名, 过滤器, 可选参数)
// echo '标题:' . $_GET['title'];
// 范围用'options' => ['min_range' => 22, 'max_range' => 55]表示
// $data = ['options' => ['min_range' => 2000, 'max_range' => 10000]];
// var_dump(filter_input(INPUT_GET, 'cost', FILTER_VALIDATE_INT, $data));
// echo '<hr>';
// 4.验证多个外部变量:filter_input_array()
$data = [
'name' => FILTER_SANITIZE_STRING,
'cost' => FILTER_VALIDATE_INT,
'exp' => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 2, 'max_range' => 10]],
'web' => FILTER_VALIDATE_URL
];
var_dump(filter_input_array(INPUT_GET, $data));
- PHP 过滤器用于验证和过滤来自非安全来源的外部数据
外部数据来源:
序号 | 数据来源 | 描述 |
---|---|---|
1 | 表单 | 来自表音的用户输入数据 |
2 | Cookies | 来自浏览器中的 cookie |
3 | 服务器变量 | 防止伪装的合法访问 |
4 | Web 服务数据 | Web 请求的数据 |
5 | 数据库查询结果 | 数据表中的数据并不可信 |
- 常用的过滤器函数
序号 | 函数 | 描述 |
---|---|---|
1 | filter_list() |
|
2 | filter_id() |
|
3 | filter_var() |
过滤单个变量 |
4 | filter_var_array() |
过滤多个变量 |
5 | filter_has_var() |
检测是否存在某个外部变量 |
6 | filter_input() |
过滤单个外部变量 |
7 | filter_input_array() |
过滤多个外部变量 |
- 外部变量类型:
INPUT_GET
,INPUT_POST
,INPUT_COOKIE
,INPUT_SERVER
,INPUT_ENV
- 过滤器主要分为二类: 验证过滤器, 清理过滤器
验证过滤器常量
- 验证过滤器: 又叫”验证器”, 主要用于数据的类型和格式验证
序号 | 过滤器函数 | 描述 |
---|---|---|
1 | FILTER_VALIDATE_INT |
验证整数 |
2 | FILTER_VALIDATE_FLOAT |
浮点点验证 |
3 | FILTER_VALIDATE_BOOLEAN |
验证布尔项 |
4 | FILTER_VALIDATE_EMAIL |
验证邮箱 |
5 | FILTER_VALIDATE_URL |
验证 URL 地址 |
6 | FILTER_VALIDATE_IP |
验证 IP 地址 |
7 | FILTER_VALIDATE_REGEXP |
正则验证 |
FILTER_VALIDATE_BOOLEAN
: 布尔选项的返回值类型
序号 | 返回值 | 描述 |
---|---|---|
1 | true |
“1”, “true”, “on” 和 “yes” |
2 | false |
“0”, “false”, “off”, “no”, “” |
3 | null |
除以上情形外 |
清理过滤器常量
- 清理过滤器: 去掉非法字符,仅保留指定内容
序号 | 过滤器函数 | 描述 |
---|---|---|
1 | FILTER_UNSAFE_RAW |
保持原始数据 |
2 | FILTER CALLBACK |
自定义函数过滤数据 |
3 | FILTER_SANITIZE_STRING |
去除标签以及特殊字符:strip_tags() |
4 | FILTER_SANITIZE_STRIPPED |
“string” 过滤器别名 |
5 | FILTER_SANITIZE_ENCODED |
URL-encode 字符串,去除或编码特殊字符 |
6 | FILTER_SANITIZE_SPECIAL_CHARS |
HTML 转义字符, 等价于 htmlspecialchars() |
7 | FILTER_SANITIZE_EMAIL |
仅保留邮箱地址的合法字符 |
8 | FILTER_SANITIZE_URL |
仅保留合法的 URL, 必须从协议开始http/https |
9 | FILTER_SANITIZE_NUMBER_INT |
仅保留合法的数字和正负号+- |
10 | FILTER_SANITIZE_NUMBER_FLOAT |
仅保留合法的数字和正负号+- 以及指数 .,eE |
11 | FILTER_SANITIZE_MAGIC_QUOTES |
等价于函数: addslashes() |
选项与标志
- 可以对过滤器设置选项和标志, 对数据进行更加精准的过滤处理
- 选项与标志使用数组键名表示:
'options'=>[...], 'flags'=>...
(复数)