PHP变量作用域(全局变量&局部变量)&global&static关键字用法实例分析

本文实例讲述了PHP变量作用域(全局变量&局部变量)&global&static关键字用法。分享给大家供大家参考,具体如下:

我们知道,变量呢,其实就相当于我们用来储存信息的容器。关于它的命名规则什么的,相信大家也是比较清楚的,这里就不赘述了。这里呢,主要就来看PHP变量的两个作用域,全局变量&局部变量。

看到这两个变量作用域,相信大家脑海里会浮现两个单词global&static。没错,就是这两个词。

我们知道,在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global 关键字。然而,在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问。下面,我们来看个实例:

<?php
$x=5; // 全局变量
function myTest()
{
  $y=10; // 局部变量
  echo "<p>测试函数内变量:<p>";
  echo "变量 x 为: $x";
  echo "<br>";
  echo "变量 y 为: $y";
}
myTest();
echo "<p>测试函数外变量:<p>";
echo "变量 x 为: $x";
echo "<br>";
echo "变量 y 为: $y";
?>

在以上实例中 myTest() 函数定义了 $x 和 $y 变量。$x 变量在函数外声明,所以它是全局变量, $y 变量在函数内声明所以它是局部变量。

当我们调用myTest()函数并输出两个变量的值,函数将会输出局部变量 $y 的值,但是不能输出 $x 的值,因为 $x 变量在函数外定义,无法在函数内使用,如果要在一个函数中访问一个全局变量,需要使用 global 关键字。

然后我们在myTest()函数外输出两个变量的值,函数将会输出全局部变量 $x 的值,但是不能输出 $y 的值,因为 $y 变量在函数中定义,属于局部变量。

由此,我们就可以知道,我们可以在不同函数中使用相同的变量名称,因为这些函数内定义的变量名是局部变量,只作用于该函数内。这也算是一个小技巧了哈。

废话不多说,我们先来看global关键字。global 关键字用于函数内访问全局变量。在函数内调用函数外定义的全局变量,我们需要在函数中的变量前加上 global 关键字,来看个实例:

<?php
$x=5;
$y=10;
function myTest()
{
  global $x,$y;
  $y=$x+$y;
}
myTest();
echo $y; // 输出 15
?>

PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。所以,上面的实例可以写成这样:

<?php
$x=5;
$y=10;
function myTest()
{
  $GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}
myTest();
echo $y;
?>

大概了解了吧,好吧,我们再来看static关键字。

当一个函数完成时,它的所有变量通常都会被删除。然而,有时候我们希望某个局部变量不要被删除。要做到这一点,就要我们第一次声明变量时使用 static 关键字。我们来看个实例:

<?php
function myTest()
{
  static $x=0;
  echo $x;
  $x++;
}
myTest();
myTest();
myTest();//运行结果: 0 1 2
?>

我们可以看到,每次调用该函数时,该变量将会保留着函数前一次被调用时的值。不过在这里咱们要知道,该变量仍然是函数的局部变量,不能再别的地方使用。不过,我们在使用递归的时候,还是会,用到这个什么static关键字的,大家有兴趣的,可以稍稍研究下。还是蛮有意思的。

通过上述的各种点吧,有以下几个总结:

1、定义在函数外部的就是全局变量,它的作用域从定义处一直到文件结尾。
2、函数内定义的变量就是局部变量,它的作用域为函数定义范围内。
3、函数之间存在作用域互不影响。
4、函数内访问全局变量需要 global 关键字或者使用 $GLOBALS[index] 数组

在 php 中函数是有独立的作用域,所以局部变量会覆盖全局变量,即使局部变量中并定义没有全局变量相同的变量,也会被覆盖。如下所示:

<?php
$a=5;
$b=3;
function t()
{
  echo $a-$b; // 输出 0
}
t();
?>

要想在函数中直接使用全局变量可以通过 global 关键字声明或者通过 php 中自定义的 $GLOBALS 数组获取:

<?php
$a=5;
$b=3;
function t1()
{
  global $a,$b;
  echo $a-$b; // 输出 2
}
t1();
echo PHP_EOL;
function t2()
{
  echo $GLOBALS['a']-$GLOBALS['b']; // 输出 2
}
t2();
?>

好啦,本次就到这里了。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php常用函数与技巧总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP数据结构与算法教程》及《php程序设计算法总结》

希望本文所述对大家PHP程序设计有所帮助。

(0)

相关推荐

  • PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】 原创

    本文实例讲述了PHP global全局变量的使用与注意事项.分享给大家供大家参考,具体如下: 使用global在方法里面声明外部变量为全局变量,即可以调用该变量. 示例1. global基本用法 <?php $a=1; $b=2; test_global(); function test_global() { global $a,$b; echo $a+$b; //输出3 } 示例2. global引用 <?php $var $a=1; function test(){ global $a;

  • 浅谈PHP变量作用域以及地址引用问题

    作用域的概念: 在PHP脚本的任何位置都可以声明变量,但是,声明变量的位置会大大影响访问变量的范围.这个可以访问的范围称为作用域. 主要的常用的包括:局部变量.全局变量.静态变量. 1.局部变量:就是在函数内声明的变量,他保存在内存的栈内,所以访问速度很快.仅在函数内有效. 2.全局变量:与局部变量相反,全局变量可以在程序的任何地方访问.只要在变量前面加关键字GLOBAL,就可以将其识别为全局变量.在整个php文件内有效. 3.静态变量:用static修饰只存在于函数作用域的变量,函数执行结束后

  • 浅析php变量作用域的一些问题

    昨晚就与到这么一个问题,是全局变量在函数中的问题.今天搜索了一下,发现一篇相当不错的文章,讲了php中的变量作用域.是一位网友翻译的在这贴一下: 变量范围变量的范围即它定义的上下文背景(译者:说白了,也就是它的生效范围).大部分的 PHP 变量只有一个单独的范围.这个单独的范围跨度同样包含了 include 和 require 引入的文件.范例: 复制代码 代码如下: <?php$a = 1;include "b.inc";?> 这里变量 $a 将会在包含文件 b.inc

  • php变量作用域的深入解析

    PHP 中的每个变量都有一个针对它的作用域,它是指可以在其中访问变量(从而访问它的值)的一个领域.对于初学者来说,变量的作用域是它们所驻留的页面.因此,如果你定义了 $var,页面余下部分就可以访问 $var,但是,其它页面一般不能访问它(除非使用特殊的变量). 因为包含文件像它们是原始(包含)脚本的一部分那样工作,所以在 include() 那一行之前定义的变量可供包含文件使用.此外,包含文件内定义的变量可供 include() 那一行之后的父(包含)脚本使用. 当使用你自己定义的函数时,所有

  • PHP Global定义全局变量使用说明

    很不习惯PHP中的变量作用域,PHP中函数变量和全局是完全隔绝的,也就是无法相互访问.比如下面这样: 复制代码 代码如下: $test = 123; abc(); //这里什么都不输出,因为访问不到$test变量function abc(){    echo($test);}$test = 123;abc(); //这里什么都不输出,因为访问不到$test变量function abc(){    echo($test);} 如果,你想在函数内部访问外部变量,你需要这样: 复制代码 代码如下: $

  • php中static静态变量的使用方法详解

    看看下面的实例: 复制代码 代码如下: <?php function Test() { $w3sky = 0; echo $w3sky; $w3sky++; } ?> 本函数每次调用时都会将 $w3sky 的值设为 0 并输出 "0".将变量加一的 $w3sky++ 没有其到效果,因为一旦退出本函数则变量 $w3sky 就不存在了.要写一个不会丢失本次计数值的计数函数,要将变量 $w3sky 定义为静态(static)的: 如下: 复制代码 代码如下: <?php f

  • PHP预定义超全局数组变量小结

    本文实例讲述了PHP预定义超全局数组变量.分享给大家供大家参考,具体如下: 1.PHP 预定义的超全局变量数组 特性: a.特殊的数组,操作方式没有区别 b.不用声明,php脚本中默认存在,因为在php中不用定义,所以在自定义变量是应避免和预定的全局变量同名 c.在全局范围内自动生效,即在函数中直接就可以使用,不用使用global关键字访问 2.超全局变量数组 a.$_SERVER 服务器变量 $_SERVER 是一个包含诸如头部信息,路径和脚本位置的数组 示例: foreach($_SERVE

  • PHP static局部静态变量和全局静态变量总结

    静态局部变量的特点: 1.不会随着函数的调用和退出而发生变化,不过,尽管该变量还继续存在,但不能使用它.倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值2.静态局部变量只会初始化一次3.静态属性只能被初始化为一个字符值或一个常量,不能使用表达式.即使局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量):静态变量的初始值为0.4.当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量.虽然用全局变量也可以达到上述目的

  • php中global和$GLOBALS[]的分析之一

    这可能引起一些问题,有些人可能漫不经心的改变一个全局变量.PHP 中全局变量在函数中使用时必须申明为全局(注意,Global这个关键字在函数中定义才有用). 1:Global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件. 复制代码 代码如下: <?PHP $a=123; function aa() { Global $a; //如果不把$a定义为global变量,函数体内是不能访问函数体外部的$a的,但是可以定义一个相

  • 全面了解PHP中的全局变量

    PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用. 你不需要特别说明,就可以在函数及类中使用. PHP 超级全局变量列表: •$GLOBALS •$_SERVER •$_REQUEST •$_POST •$_GET •$_FILES •$_ENV •$_COOKIE •$_SESSION 本章节我们将讲解几个常用的超级全局变量,其余变量我们在接下来几个章节会介绍到. PHP $GLOBAL $GLOBAL 是PHP的一个超级全局变量组,在

  • 浅谈php中include文件变量作用域

    在php中我们有时候需要include一个文件.比如我前段时间在写一个框架的时候,打算用原生的php作为模板,然后写一个display方法引入模板文件就可以,但是这只是我的意淫而已. 写完后发现在模板中所有的变量都提示未定义.通过各种研究和查找资料,总结了include文件时的几种情况下的作用域. 第一种情况:A文件include B文件,在B文件中可以调用A中的变量. A文件代码: <?php $aaa = '123'; include "B.php"; B文件代码: <

  • PHP预定义变量9大超全局数组用法详解

    1.$_SERVER $_SERVER超级全局变量包含由web服务器创建的信息,它提供了服务器和客户配置及当前请求环境的有关信息.根据服务器不同,$_SERVER中的变量值和变量个数会有差别,不过一般都可以找到CGI1.1规范中定义的变量.其中包括: $_SERVER['HTTP_REFERER']; 引导用户到达当前位置的页面的URL : $_SERVER['REMOTE_ADDR']; 客户IP地址 : $_SERVER['REQUEST_URI']; URL的路径部分.如果URL是 [ur

随机推荐