PHP变量作用域,全局变量和局部变量,global和GLOBALS
在PHP中变量主要有:内置超级全局变量,一般的变量,常量,全局变量,静态变量等.
超级全局变量
PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。
$GLOBALS 所有全局变量数组
$_SERVER 服务器环境变量数组
$_GET 通过GET方法传递给该脚本的变量数组
$_POST 通过POST方法传递给该脚本的变量数组
$_COOKIE cookie变量数组
$_FILES 与文件上载相关的变量数组
$_ENV 环境变量数组
$_REQUEST 所有用户输入的变量数组
$_SESSION 会话变量数组
全局变量和局部变量
1、定义在函数外部的就是全局变量,它的作用域从定义处一直到文件结尾,但不包括函数内。
2、函数内定义的变量就是局部变量,它的作用域为函数定义范围内。
<?php
$var1 = 1;
$var2 = 11;
function foo()
{
echo "未知变量 var1 = $var1 \n";//
global $var1,$var2;
$var1 += 1;
$var2 = "sss";
}
foo();
echo "函数外全局变量 var1 === $var1 \n";
echo "函数外全局变量 var2 === $var2 \n";
?>
global和GLOBALS
1、$GLOBALS[‘var’]是外部的全局变量本身
2、global var的同名引用或者指针。
3、函数内针对gobal变量 调用unset()或者&赋值,改变的是函数内变量,不会影响函数外全局变量
4、任意对方针对GLOBALS[var],调用unset或者&,改变的都是全局变量本身
$var1 = $var2 = $var3 = 1;
//global 使用&改变变量引用,使用unset()
function foo2()
{
global $var1,$var2,$var3;
$var1 = &$var2;
$var1 = 21;
unset($var3);
}
foo2();
echo "global下 &操作改变var1 为var2,同时改变var1 此时var1=== $var1 \n";//var1仍为1
echo "global下 &操作改变var1 为var2,同时改变var1 此时var2=== $var2 \n";//var2从11->22
echo "global下 unset(var3) === $var3 \n";
// GLOBAL操作
$var1 = $var2 = $var3 = 1;
function foo3()
{
// GLOBALS["var1"]
echo "函数内GLOBALS[VAR1] ===== ",$GLOBALS['var1'],"\n";
echo "函数内GLOBALS[VAR2] ===== ",$GLOBALS['var2'],"\n";
$GLOBALS['var1'] = &$GLOBALS['var2'];
$GLOBALS['var1'] = 33;
unset($GLOBALS['var3']);
}
foo3();
echo "函数外全局变量GLOBALS[VAR1] ===== ",$var1,"\n";
echo "函数外全局变量GLOBALS[VAR2] ===== ",$var2,"\n";
echo "函数外全局变量GLOBALS[VAR3] ===== ",$var3,"\n";
const,static,define
1、define是一个函数,可以出现在任意允许使用函数的地方
bool define ( string $name , mixed $value [, bool $case_insensitive = false ]
define可以使用表达式
define第三个参数表示忽略大小写
define变量不需加 $
2、const 在编译器执行
const必须出现在作用域顶端,不能存在于函数,循环,if语句中
const可以出现在class,interface中
const变量不需要 $
3、static 指静态变量,需要关键字 $
函数体中的静态变量
类中的静态属性和方法
define("TOTAL",1000);
echo TOTAL,"\n";
$var1 = 100;
define("VAR_".$var1,$var1+100);
echo VAR_100,"\n";
const CONST_PI = 3.14159;
echo CONST_PI,"\n";
function fun()
{
static $s1 = 100;
return $s1++;
}
echo fun(),"\n";
echo fun(),"\n";
echo fun(),"\n";