应用 IT 技术
解决实际问题

PHP中通过global或$GLOBALS使全局变量在函数中可用的正确方式及其区别

PHP 用户自定义函数中的变量在默认状态下为局部变量,即其变量只在函数内部生效。

示例1:

<?php
  $name='Amy';
  function change_name(){
    $name='Baby';  
  }
  change_name();
  echo 'My name is '.$name.'.<br/>';  //My name is Amy.
?>

那么,如果想让函数内的变量在函数外部有效,我们就需要将其设置为全局变量。PHP 中有两种方式可以使全局变量在函数中可用:一种是使用 global 声明变量,另一种是使用超全局变量 $GLOBALS 。

 

一、使用 global 关键字

示例2(无效方式):

<?php
  global $name;
  $name='Amy';
  function change_name(){
    $name='Baby';  
  }
  change_name();
  echo 'My name is '.$name.'.<br/>';  //My name is Amy.
?>

注意!从示例2中可以看到,在函数外将变量声明为全局的并没有影响到函数内的变量。那么,怎么样才是正确的方式呢?

示例3(正确方式):

<?php
  $name='Amy';
  function change_name(){
    global $name;
    $name='Baby';  
  }
  change_name();
  echo 'My name is '.$name.'.<br/>';  //My name is Baby.
?>

从示例3中可以看到,在函数中将变量声明为 global 使我们得到了期望的结果,这就是通过 global 使全局变量在函数中可用的正确方式。

 

二、使用超全局变量 $GLOBALS

除了使用 global 关键字定义外,还可以使用超全局变量 $GLOBALS 。$GLOBALS 是一个关联数组,每一个变量为一个元素,键名对应变量名,值对应变量的内容。它在一个脚本的全部作用域中都可用。

示例4:

<?php
  $name='Amy';
  function change_name(){
    $GLOBALS['name']='Baby';
  }
  change_name();
  echo 'My name is '.$name.'.<br/>';  //My name is Baby.
?>

 

三、global 和 $GLOBALS 的区别

示例5:

<?php
  $var1=1;
  $var2=2;
  function test1(){
    $GLOBALS['var2']=&$GLOBALS['var1'];
  }
  test1();
  echo $var2.'<br/>';  //1
  
  $var3=1;
  $var4=2;
  function test2(){
    global $var3,$var4;
    $var4=&$var3;
  }
  test2();
  echo $var4;          //2
?>

从示例5中可以看到,使用引用变量时,$GLOBALS 和 global 的处理结果并不一致。对此,官方说明是:$GLOBALS[‘var’] 是外部的全局变量本身,而 global $var 是外部 $var 的同名引用或者指针。由此便可解释:示例5中函数 test2() 中的 $var4 原本是对函数外 $var4 的引用,而函数内执行 $var4=&$var3 之后,函数内的 $var4 不再与函数外的 $var4 指向同一个内存空间,因而函数外的 $var4 值不变。我们再来看另一个例子——

示例6:

<?php
  $var1=1;
  function test1(){
    unset($GLOBALS['var1']);  
  }
  test1();
  var_dump($var1);  //NULL
  
  $var2=1;
  function test2(){
    global $var2;
    unset($var2);  
  }
  test2();
  echo $var2;       //1
?>

PHP引用变量详解 一文中我们提到过,对引用变量使用 unset 只会取消引用,而不会销毁空间。因而从示例6中的结果也可以看出,global 声明的变量只是调用外部变量的一个别名而已。

未经允许不得转载:酷睿N核博客 » PHP中通过global或$GLOBALS使全局变量在函数中可用的正确方式及其区别
支付宝打赏微信打赏

如果文章对您有所帮助,欢迎移至上方按钮打赏作者

分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址