变量、过滤器和常量
1.1 函数作用域
函数作用域是function关键字创建的作用域
function index()
{
$date['uid'] = 1;
return $date['uid'];
}
unset($date['uid']);//未定义报错
echo index();//1
unset($date['uid']);//未定义报错
function add()
{
$date['pid'] = 1;
unset($date['pid']);
unset($date['uid']);
return $date['pid'];//未定义报错
}
echo add();//无输出
echo index();//1
小结:
date[‘uid’]只能在index函数中起作用 在index函数外访问会出现未定义报错
1.2 全局作用域
函数之外的变量生效范围
1.3 变量类型
- 私有变量
- 全局变量
- 超全局变量
1.3.1 私有变量
函数中定义的变量
1.3.2 全局变量
函数之外定义的变量
1.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 | 通过环境方式传递给当前脚本的变量的数组 |
1.3.4 global 和 $GLOBALS 的使用
global $name="xu.bug";//Parse error: syntax error, unexpected '=', expecting ',' or ';'
function index()
{
//试图引用函数外面的变量
echo "myname is ".$name."<br>";
}
index();
即上述代码有错误。原因是 global的用法不对,不能在用global声明变量的同时给变量赋值。
global $name;
$name="xu.bug";
function index()
{
//试图引用函数外面的变量
echo "myname is ".$name."<br>";//Notice:Undefined variable: name in
myname is
}
index();
即上述代码有错误。原因是 global的用法不对,不能在用global声明变量的同时给变量赋值。
综合以上得出结论:
global的正确用法是:”在一个函数中引入外部的一个变量,如果该变量没有通过参数传递进来,那么就通过global引入进来。” 也就是说,当一个函数引用一个外部变量时,可以在函数内通过global来声明该变量,这样该变量就可以在函数中使用了(相当于当作参数传递进来)。
$name="xs.bug";
function index()
{
global $name;
//试图引用函数外面的变量
echo "myname is ".$name."<br>";
}
index(); //myname is xs.bug
即上述代码说明global是起传递参数的作用,而并非使变量的作用域为全局 。
$name="xs.bug";
function index()
{
$gname=$GLOBALS['name'];
//试图引用函数外面的变量
echo "myname is ".$gname."<br>";
}
index(); //myname is xs.bug
1.3.5 static 静态变量
在函数执行完后,变量值仍然保存 不用静态变量 调用函数后会马上进行销毁
function testStatic() {
static $val = 1;
echo $val;
$val++;
}
testStatic(); //output 1
testStatic(); //output 2
testStatic(); //output 3
1.4 filter过滤器
相关函数
filter_list() 获去过滤器名称
filter_id() 获去过滤器id
filter_input(); 单个传参值验证
filter_input_array(); 数组传参验证
foreach (filter_list() as $filter) {
echo $filter.'------'.filter_id($filter).'<br>';
}
//可遍历出所有名称和id
简单验证
$args = [
'username' => 513,
'email' => 274,
'age' => ['filter' => 257, 'flags'=>FILTER_REQUIRE_SCALAR, 'options' => ['min_range' => 18,'max_range'=>80]],
'blog' => 273,
];
var_dump(filter_input_array(INPUT_GET, $args));.
1.5 常量
在整个运行过程中,固定不变的值
1.5.1 定义常量
1 define(常量名,值,[是否区别大小写]) true表示不区分大小写,默认是false,常量名前没有$符,常量名推荐使用大写
<?php
define('NAME','tom'); //定义常量
define('PI',3.14,true); //定义常量,不区分大小写
echo NAME,'<br>',Pi;
//true表示不区分大小写,默认是区分大小写的。
2、定义常量可以用特殊字符,但是在调用的时候必须用constant
关键字调用
define('%-%','tom');
echo constant('%-%'); //通过constant获取特殊字符作为常量名的常量
3、判断常量是否定义,通过defined()判断常量是否已经定义
if(!defined('NAME')){
define('NAME','berry');
}
echo NAME; //berry
4、还可以使用const关键字定义常量
const NAME='tom';
echo NAME; //tom
5、define()和const 区别
define()可以函数和流程控制中定义 而const不行
const 可以用在类中 而 define()不行
1.5.2魔术常量
- 魔术常量属于”预定义常量”, 比较特殊所以单独列出
- 所谓”魔术”, 是指常量的值, 会随它们在代码中的位置改变而改变
- 魔术常量不区分大小写, 但是推荐全部大写
序号 | 魔术常量 | 描述 |
---|---|---|
1 | __LINE__ |
文件中的当前行号 |
2 | __FILE__ |
文件的完整路径和文件名 |
3 | __DIR__ |
文件所在目录 |
4 | __FUNCTION__ |
当前的函数名称 |
5 | __CLASS__ |
当前类名称 |
6 | __TRAIT__ |
当前Trait 名称 |
7 | __METHOD__ |
当前类方法名称 |
8 | __NAMESPACE__ |
当前命名空间名称 |