PHP变量作用域中的几个问题

昨晚,这个问题是函数中全局变量的问题。今天,我搜索了一篇关于PHP变量范围的文章:

变量范围
变量的范围是其定义的上下文(译者:即其生效的范围)。大多数PHP变量只有一个范围。这个单独的范围跨度也包含了包含和要求引入的文件:
复制代码代码如下所示:
< PHP
$ = 1;
包括b.inc ;
>

变量$a这里将在包含文件b.inc.however生效,在用户定义的函数,局部函数范围将推出。在一个函数中使用任何变量是有限的局部功能在默认的情况下,uff1a实例
复制代码代码如下所示:
< PHP
$ = 1

功能测试()
{
向本地范围变量返回一个引用;
}

测试();
>

脚本没有任何输出,因为回声语句引用变量a的本地版本,在这个范围内,它没有赋值。在C语言中,全局变量在函数中自动实现,除非它们被局部变量所覆盖,这可能会导致问题,有些人可能不小心改变全局变量。

全球的关键词
首先,使用全局的一个例子:
例12-1。利用全球
复制代码代码如下所示:
< PHP
$ = 1;
$ = 2;

函数和()
{
全球$ A,B;

美元=;
}

(和);
回声$;
>

以上脚本的输出将是3。全局变量$和$ B在函数声明,所有的任何变量的引用变量指向全球variable.php没有限制全局变量的最大数目,一个函数可以声明。

访问在全球范围变量的第二种方法是自定义的全局数组美元用一种特殊的PHP。前面的例子可以写为:

例12。使用全局变量来取代美元的全球
复制代码代码如下所示:
< PHP
$ = 1;
$ = 2;

函数和()
{
美元的B= { } = = {一美元} = {B + $ };
}

(和);
回声$;
>

在美元的全局数组,每个变量是一个关键因素,相应的变量名,变量的内容。美元在全球范围内的全局存在的原因是,美元是一个超级全局变量。下面的例子显示了超级全局变量的使用:

例12-3。演示超级全局变量和范围的示例。
复制代码代码如下所示:
< PHP
test_global()函数
{
大多数变量不是预先定义的超级
全球http_post_vars美元;

打印http_post_vars美元{ 'name' };

/ / superglobals在任何范围内是有效的,他们不需要a'global' statement.superglobals介绍PHP 4.1.0。
打印_post美元{ 'name' };
}
>

使用静态变量
变量范围的另一个重要特征是静态变量(静态变量)。静态变量只存在于局部函数域中,但当程序执行字段时,这个值不会丢失:

例12-4。演示静态变量的示例。
复制代码代码如下所示:
< PHP
功能测试()
{
$ = 0;
回声$;
美元+;
}
>

这个函数是没有用的,因为$的值被设置为0,并且为每个调用输出0。对变量添加一个变量不起作用,因为一个函数被撤回,变量$ A不存在:

例12-5。是使用静态变量的一个示例。
复制代码代码如下所示:
< PHP
功能测试()
{
静态$ = 0;
回声$;
美元+;
}
>

现在,每个调用测试()函数将输出$的值并添加一个。

静态变量也提供一种方法来处理递归函数,递归函数调用自身。小心当你写一个递归函数,因为它可以无限递归。要保证有足够的办法停止递归。这个简单的函数递归计数为10,采用静态变量$计数来确定何时停止:

例12-6。静态变量与递归函数
复制代码代码如下所示:
< PHP
功能测试()
{
静态$ = 0;

数+;
回波计数;
如果(计数为10){
(试验);
}
数美元--;
}
>

注意:静态变量可以在上面的例子中声明。如果表达式的结果在声明中赋值给它,它会导致一个要解析的错误。

例12-7。声明静态变量
复制代码代码如下所示:
< PHP
函数(){
静态$ int = 0; /更正
静态$ = 1 + 2; /错误(因为它是一个表达式)
静态变量int = sqrt(121); / /错误的(因为它是一个表达过)

元+ +;
返回值;
}
>

对全局变量和静态变量的引用
在Zend引擎1代,PHP4的驱动,并为变量的静态和全局定义中引用的方式实现的。例如,一个真正的全局变量,在一个全球进口声明函数域实际上是引用一个全局变量,这可能导致意外的行为,如下面的例子证明:
复制代码代码如下所示:
< PHP
功能test_global_ref(){
全球为目标;
$ obj =新stdClass;
}

功能test_global_noref(){
全球为目标;
$ obj =新stdClass;
}

test_global_ref();
var_dump($ obj);
test_global_noref();
var_dump($ obj);
>

上述示例的执行将产生以下输出:
NULLobject(stdClass)(0){ }
类似的行为也适用于静态语句。引用不是静态存储的:
复制代码代码如下所示:
< PHP
功能get_instance_ref(){
静态$ obj;

静态对象:;
var_dump($ obj);
如果(!isset(){ $ obj)
对静态变量的引用
$ obj =新stdClass;
}
$ obj ->属性+ +;
返回的对象;
}

功能get_instance_noref(){
静态$ obj;

静态对象:;
var_dump($ obj);
如果(!isset(){ $ obj)
将一个对象分配给一个静态变量
$ obj =新stdClass;
}
$ obj ->属性+ +;
返回的对象;
}

以此为get_instance_ref(美元);
still_obj1美元= get_instance_ref();

$ obj2 = get_instance_noref();
still_obj2美元= get_instance_noref();
>

上述示例的执行将产生以下输出:
静态对象:对象:对象:nullstatic nullstatic nullstatic对象:对象(stdClass)(1){ {财产} = > int(1)}

这个例子演示了当引用赋值给一个静态变量,以get_instance_ref二叫()函数和它的价值是不记得。