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

posted @ 2016-11-17 10:08  歲夢灬沉浮  阅读(527)  评论(0)    收藏  举报