php 中 global等超全局变量的作用域
global,意思是全局,用来在PHP程序中定义变量的作用域,下面就有借于此学习一下PHP中变量的作用域:
1、变量仅在所定义的范围内可见(也就是可用),看下面一段程序:
<?
$x=10;
function test(){
$x=50;
}
test();
echo $x
?>
像上面这段程序,会输出10,还是50呢?答案是:10,因为$x=50只是在函数中给$x赋予了50的值,虽然程序运行到:test()时,$x=50,但是函数中的$x和前面赋值10的$x是分开存放的,值为50的$x只在函数运行时有用,到后面的echo $x时,50的$x将不再起作用,所以最后输出的值是全局的10;
可以使用global定义全局变量,global一般在函数和类中使用,使用该函数定义后的变量将在整个文件范围内可见,可用,看下面的程序:
<?
$x=10;
function test(){
global $x;
$x=50;
}
test();
echo $x;
?>
上面的程序运行结果将输出:50,因为在函数test()中已经将变量$x定义成了全局的变量,在程序运行到test()时,将调用test函数,并执行对$x的50赋值,这样,在输出时就输出了50;
还有一种定义全局变量的方法,是使用$GLOBAL,即大写的$global[]来定义,看下面的一段程序:
<?
$x=10;
function test(){
$GLOBAL['x']=50;
}
test();
echo $x;
?>
像上面这段程序就将输出50的值,与使用global定义全局变量作用一样,这样的定义方式我暂时还不知道有什么特殊的作用,在这里说出来只是希望下次看到别人程序里面有这样用法的能看懂。
与$GLOBAL同类的被称为超全局变量,除了$GLOBAL还有下面一些:
$_SERVER :服务器设置变量;
$_ENV :环境变量;
$_GET :通过URL提供给脚本的变量;
$_POST :通过HTML POST方式提供给脚本的变量;
$_COOKIE :通过HTML cookies提供给脚本的变量;
$_FILE :通过HTML POST文件上传所上传的变量;
$_REQUEST :GET、POST、COOKIE方式提供的所有变量;
$_SESSION :目前在会话中注册的变量
PHP有关变量的作用域大致就说到这里,前面的几种变量定义方式都很好理解,最后一种变量定义方式可以从常用的$_SESSION来理解它们的一些使用规则。
在类中,PHP也使用了成员和属性这样的思想,PHP在老版本中对成员都使用var来声明,在5.x以后可以使用:public,private,protected和static来定义变量;
Const :定义一个常量成员;
Public :类的任何对象都可以访问;
Protected :可以从定义这个成员的类及其派生类访问;
Private :可以从定义这个成员的类访问;
Static :修饰符,单独使用时假设成员是公共的;
看下面一段程序:
<?
class myclass{
public $s;
function set($val){
$this->s=$val;
}
}
$obj=new myclass;
$obj->set(888);
echo "$obj->s\n";
$obj->s=168;
echo "$obj->s\n";
?>
像上面一段程序,就是在类中定义了一个公共成员变量:$s,以及一个赋值的函数:set($val);当定义了一个myclass类的对象$obj后,$obj可以使用类中的函数set($val)来对类里面的成员变量$s赋值,也可以直接对成员变量$s赋值,$obj->set(888);就是使用类里面的set($val)函数对$s进行了赋值,$obj->a=168则是直接对$s进行了赋值。所以上面程序的输出结果是:先输出888,然后跳行输出168。
将上面的程序进行修改,得到下面的程序:
<?
class myclass{
private $s;
function set($val){
$this->s=$val;
}
}
$obj=new myclass;
$obj->set(888);
echo "$obj->s\n";
$obj->s=168;
echo "obj->s\n";
?>
上面段程序仅仅将类的成员变量$s的定义方式写成了private,其作用是只限该类内部访问,所以使用$obj->s就会出错其错误提示如下:
Fatal error:Cannot access private property myclass::$s in /....php on line ..
所以,几个人合作开发一个项目时,一定要避免使用public来定义类中的成员变量,而使用private这样的定义方式来定义,然后提供一个接口(像set($val)这样的函数就称之为接口)。
使用private 在类中定义了成员变量,可以提供使用该成员变量的接口,以上面两段程序为例,看下面的程序,该段程序就提供了一个使用类中private定义的变量的方法:
class myclass{
private $s;
function set($val){
$this->s=$val;
}
function get(){
return $this->s;
}
}
$obj=new myclass;
$obj->set(888);
echo $obj->get()."\n";
注意上面在输出时使用的是:$obj->get()来输出$s的值的。
小结:凡是类中使用了private定义的就不能够直接去访问这些成员,而必须使用类里面提供的方法去访问,如果使用的是protected定义的,则不能被类和派生类修改。
可以使用修饰符来定义类里面的成员,这样定义后的成员可以不进行示例化而直接访问类里面的成员,当然这样定义的成员,它的值是不受外界变化而变化的,所以有两种修饰符可以用来定义该类成员:const和static,看下面的程序:
class myclass{
const MYCONST=888;
static $val=168;
}
echo 'myclass::MYCONST='.myclass::MYCONST."\n";
echo 'myclass::$val='.myclass::$val."\n";
像上面使用const和static来定义的成员就可以使用类名::成员名来访问这些成员。
但是这里需要注意的是:如果使用static来定义的变量,在前面使用了private,则不能够直接用类名::成员名来访问,切记。
转载:http://www.111cn.net/phper/php/global.htm

浙公网安备 33010602011771号