变量、过滤器和常量
1.1 函数作用域
函数作用域是function关键字创建的作用域
functionindex()
{
$date['uid']=1;
return$date['uid'];
}
unset($date['uid']);//未定义报错
echo index();//1
unset($date['uid']);//未定义报错
functionadd()
{
$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 ';'
functionindex()
{
//试图引用函数外面的变量
echo"myname is ".$name."
";
}
index();
即上述代码有错误。原因是 global的用法不对,不能在用global声明变量的同时给变量赋值。
global$name;
$name="xu.bug";
functionindex()
{
//试图引用函数外面的变量
echo"myname is ".$name."
";//Notice:Undefined variable: name in
mynameis
}
index();
即上述代码有错误。原因是 global的用法不对,不能在用global声明变量的同时给变量赋值。
综合以上得出结论:
global的正确用法是:”在一个函数中引入外部的一个变量,如果该变量没有通过参数传递进来,那么就通过global引入进来。” 也就是说,当一个函数引用一个外部变量时,可以在函数内通过global来声明该变量,这样该变量就可以在函数中使用了(相当于当作参数传递进来)。
$name="xs.bug";
functionindex()
{
global$name;
//试图引用函数外面的变量
echo"myname is ".$name."
";
}
index();//myname is xs.bug
即上述代码说明global是起传递参数的作用,而并非使变量的作用域为全局 。
$name="xs.bug";
functionindex()
{
$gname=$GLOBALS['name'];
//试图引用函数外面的变量
echo"myname is ".$gname."
";
}
index();//myname is xs.bug
1.3.5 static 静态变量
在函数执行完后,变量值仍然保存 不用静态变量 调用函数后会马上进行销毁
functiontestStatic(){
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).'
';
}
//可遍历出所有名称和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,常量名前没有$符,常量名推荐使用大写
define('NAME','tom');//定义常量
define('PI',3.14,true);//定义常量,不区分大小写
echo NAME,'
',Pi;
//true表示不区分大小写,默认是区分大小写的。
2、定义常量可以用特殊字符,但是在调用的时候必须用constant关键字调用
define('%-%','tom');
echo constant('%-%');//通过constant获取特殊字符作为常量名的常量
3、判断常量是否定义,通过defined()判断常量是否已经定义
if(!defined('NAME')){
define('NAME','berry');
}
echo NAME;//berry
4、还可以使用const关键字定义常量
constNAME='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__
当前命名空间名称