变量作用域 常量 变量过滤器
1.变量作用域
- 作用域: 代表在这个区域 生效的范围。
- 变量作用域: 代表变量在某个生效的范围 变量只有在生效的区域内 才能被正常使用 超出范围将无法使用。
- (作用域是变量的生效范围,是查找变量的工具)。
- 只要是变量一定有一个作用域。
函数作用域(局部作用域): 定义到函数内部的变量,其作用域是局部的
(全局作用域): 定义到函数外部的变量,其作用域是全局的
// 全局变量 作用域为全局
// 通过 关键字 global 或者 $GLOBALS
$siteName = '盘古开天辟地';
// 函数作用域 (局部作用域)
// 函数后面的 :string 代表返回类型 作用和 TS类似 强制规定返回的参数的类型 避免因为参数类型不匹配出现的问题 (弱类型和强类型的区别)
// php7版本后 支持函数返回类型可声明的支持
function getInfo():string
{
// php 在函数内部是不能直接访问全局变量的 php函数会创建一个独立的内部空间(函数作用域)。 如果php函数内部需要访问全局变量,只能通过 global 或者 $GLOBALS 才能访问全局变量
// 我们创建的全局变量会自动成为 超全局变量$GLOBALS数组中的元素
// 超全局变量不受作用域限制 可以在函数内直接方位
// php可以访问外部函数 php函数只受命名空间的限制
// php函数内部 可以直接访问内部变量
// 和javascript不同 javascript在函数内部 可以直接访问到全局属性
// return $siteName; 报错 未定义该变量
// 通过 global
// global 现在用的不多
// 用法
// global $siteName;
// return $siteName;
// 通过 $GLOBALS 直接访问
return $GLOBALS['siteName'];
}
echo getInfo(); // 执行 php函数
2.常量
- 常量一旦定义 则不可变更 (只读)
- 常量前没有 $
- 常量必须初始化 const SEX = 0;
- 常量不受作用域的限制
- 常量本身可以使用小写来定义 但为了和变量有所区分 建议使用字母大写 多个单词使用下划线来定义常量
- 类中定义常量 不能使用 define函数 只能使用 const来定义
常见常量的方法
// 1. 关键字 const
const APP_NAME = '超级网络';
// 2. define() 函数
define('APP_ID',123);
// 区别 在类中定义常量 无法使用 define函数
class User{
// 类中定义常量只能使用 const 无法使用define()
const IS_PEOPLE = true;
// define('NATION','china');
}
// 常量无法修改
// APP_NAME = '123'; 错误
// 常量必须初始化
// const SEX; 错误
// 常量一旦被定义 就无法被删除
// unset(APP_NAME); 错误
// 查看系统常量 使用函数 get_define_constants();
// print_r(get_define_constants());
// 常量分类 传入参数 true
// get_define_constants(true);
// 其中 系统常量数组中 user分类为用户自定义常量
// 用户自定义常量获取
// get_define_constants(true)['user'];
// 输出常量
// 1. 直接输出 echo 变量名;
// 2. 通过 constant('变量名');
// 两种输出变量的方式有何区别?
// 例如:
// 如果用一个变量保存一个常量名 希望通过这个变量的值来获取对应的常量 这时候 直接用 echo 并不能正确的输出这个常量(只能打印这个变量的值) 此时需要使用constant()
$appName = 'APP_NAME';
echo $appName; // APP_NAME
echo constant($appName); // 超级网络
预定义常量
echo 'php版本号:'.PHP_VERSION.'<br>';
echo '最大整数:'.PHP_INT_MAX.'<br>';
echo '目录分隔符:'.DIRECTORY_SEPARATOR.'<br>';
// ...
3.魔术常量
- 魔术变量的值随着它们的位置变化而变化
- 虽然是常量 但它们的值 总是随着代码的位置或者 不同的文件变化
- 只读 它的值随环境变化而变化
echo '当前行号'.__LINE__.'<br>';
echo '当前文件'.__FILE__.'<br>';
echo '当前目录'.__DIR__.'<br>';
// ...
4.命名空间
- 针对不受作用域限制的成员(全局成员,全局变量,常量,函数…)。
全局对象 容易出现 命名冲突的问题(都在全局作用域中)。
解决全局成员的命名冲突问题
// 两个常量发生命名冲突
// const APP_NAME = 'local';
// const APP_NAME = 'localOne';
// 定义两个不同的命名空间 分别定义 APP_NAME;
//
namespace ns1{
const APP_NAME = 'local';
// 报错 此时ns2还没有定义;
// echo \ns2\APP_NAME;
}
namespace ns2{
const APP_NAME = 'localOne';
echo \ns1\APP_NAME; // local
}
// 在全局命名空间中同时打印 ns1 和 ns2 中的 APP_NAME;
namespace {
echo \ns1\APP_NAME; // local
echo \ns2\APP_NAME; // localOne
}
5.变量过滤器
查看内置过滤器 filter_list();
过滤单个变量 filter_var();
// 验证单个年龄
$age = 18;
// 过滤单个变量 filter_var();
// filter_var(需要过滤的变量,过滤器常量);
// 返回的是布尔值
var_dump($age,FILTER_VALIDATE_INT);
// 如果是整数 返回 当前这个值 如果不是整数 返回 false
// 如果需要加上自己的参数限制 需要额外配置信息
$options = ['options'=>['min_range'=>18,'max_range'=>60]];
var_dump($age,FILTER_VALIDATE_INT,$options);
// 验证单个邮箱
$email = '28950713@qq.com';
var_dump('$email',FILTER_VALIDATE_EMAIL);
- 验证多个变量 filter_var_array();
$a = 10;
$b = 'php';
// 判断多个参数是否为整数
var_dump([$a,$b],257);
// array(2) { [0]=> int(10) [1]=> bool(false) }
- 验证外部变量(通过http 请求过来的参数)
filter_input() filter_input(请求方式,变量名,过滤器,变量)
// 通过get演示外部参数的获取与验证(过滤);
// filter_input()
// filter_input(指明输入的类型(get/post),变量名,过滤器,变量);
// echo 'id='.$_GET['id'];
// 可以通过if...else.. 但比较繁琐
$options = ['options'=>['min_range'=>1]];
var_dump(filter_input(INPUT_GET,'id',FILTER_VALIDATE_INT,$options))
- 验证外部多个变量 filter_input_array();
$args = [
'username'=> FILTER_SANITIZE_STRING,
'email'=> FILTER_VALIDATE_EMAIL,
'age'=>['filter'=>FILTER_VALIDATE_INT,'options'=>['min_range'=>18,'max_range'=>60]],
'blog'=> FILTER_SANITIZE_URL
];
var_dump(filter_input_array(INPUT_GET,$args));