<?php  
// 例子1  
function test_global() {  
  global $var1, $var2; //???(第一问)这里的$var1是一个别名,还是一个地址,还是跟函数外面的全局的$var1完全一样? 
  $var2 = &$var1;  
}  
function test_globals() {  
  $GLOBALS['var3'] = &$GLOBALS['var1'];  //???(第二问)$GLOBALS['var1']应该与函数外面的全局的$var1完全一样吧?
}  
$var1 = 5;  
$var2 = $var3 = 0;  
test_global();  
print $var2 ."\\n"."<br />"; 
$var1 = 5;  
$var2 = $var3 = 0; 
$var3= &$var1;//???(第三问)变量前面加个&是什么意思;(第四问)这时$var3是个地址还是个别名?
//test_globals();  
print $var3 ."\\n"."<br />";  
exit;
?> 请老大们一个问题一个问题解答。谢谢

解决方案 »

  1.   

    1.global声明外部变量和外部变量一样
    2.$GLOBALS 不定义变量,只是说明某变量是全局变量
    3.是地址1
      

  2.   

    global 是在外部定义全局变量的
    $GLOBALS是在内部调用之前生命用的
    &$var1是取变量的地址用的
      

  3.   

    global 是在外部定义全局变量的:这句话说得不对吧,在函数内部,使用global是为了使用外部的全局变量。而外部变量默认就是全局变量,不用global也行。
      

  4.   

    $var1=$var2
    echo $var1
    $var1=&$var2
    echo $var1
    发现结果是一样的
    请问这两句有什么区别?
      

  5.   

    函数形参如果是一个变量,形参就是实参的值的复制,函数内部如果修改了形参,不影响实参的值。而形参如果是一个引用,函数内部如果修改了这个形参,那么,会影响外面的实参的值。
    引用(别名)与原变量是一样的,一个修改后,另一个也会修改。
    如果在函数内部,使用global $var,那么如果函数内部把$var赋值为一个具体的常数或者一个变量,那么外部的$var会改变。而如果内部把$var赋值为一个变量的引用,那么外部$var的值不会改变。也就是说,不能在函数内部把全局变量赋值为一个引用。这是我自己总结的,请老大们指正。。
      

  6.   

    看php官方参考文档吧,有中文译本,什么东西都很清楚,查阅非常方便,CSDN资源下载里肯定也有
      

  7.   

    php里,一个变量可以分成三个部分来理解,一个是变量的名字,一个是变量的值,一个是变量的地址。变量的名字指向变量的值,代码里看到名字,就是表示这个变量的值。变量的别名,是变量的另一个名字。变量的地址,是变量的存储空间的地址,这个只是理解起来有用,而实际代码中不会出现,这一点与c语言不相同。
    基于上面的原则,下面就容易理解了:func($a, &$b){}
    函数的形参,可以是一个变量的值,可以是一个变量的名字。函数形参如果是一个变量的值($a),形参就是实参的值的复制,函数内部如果修改了形参的值(比如$a=2;),不影响实参的值。而形参如果是一个引用(&$b),那么形参的地址就是实参的地址的复制,函数内部,如果修改了这个形参的值,那么,会影响外面的实参的值。(当然,函数调用时,可能实参是一些常量,这时当然就是传值了。)。如果修改这个形参为另一个变量的引用,那么这个形参的地址就变了,就不指向实参的值的存储空间了。而这时,对形参的值的改变就不会影响到实参的值。引用(别名)与原变量是一样的,一个修改后,另一个也会修改。
    如果在函数内部,使用global $var,那么如果函数内部把$var赋值为一个具体的常数或者一个变量,那么外部的$var会改变。而如果内部把$var赋值为一个变量的引用,那么外部$var的值不会改变。也就是说,不能在函数内部把全局变量赋值为一个引用。
    这是php手册的说明:如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。
    可以这样理解,函数内部,global $var,这时,$var实质上是外部全局变量$var的一个别名,它们指向同一块内存。而函数内部对$var修改为另一个变量的引用,只是把这个别名变为另一个变量的别名了,而没有修改外部全局变量。
    一个变量,是一个名字,一个别名,也是一个名字。它们可能指向一个具体的值。
    函数参数值递时,如果形参是一个变量不是一个别名,那么形参的值是实参的值的复制。如果是一个别名,那么形参的值是实参的名字的复制。而函数内部,对形参赋一个具体的常量或者一个变量(非别名),是对形参指向的值的改变。对形参赋值一个别名,那么只是使这个形参指向另一个值就是了。而实参,也就是外面的变量的名字,仍然指向原来的值。也就是说,不会影响外面的实参的值。
    unset($var)是对$var这个变量unset,所以如果是函数内部使用,对函数内部的global $var进行unset,不会影响外面的全局$var。
    一个变量是另一个变量的别名,对其中一个变量unset不会影响另一个。一点自己的想法,不过对楼主没用,一个人一个认识