<?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
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;
?> 请老大们一个问题一个问题解答。谢谢
2.$GLOBALS 不定义变量,只是说明某变量是全局变量
3.是地址1
$GLOBALS是在内部调用之前生命用的
&$var1是取变量的地址用的
echo $var1
$var1=&$var2
echo $var1
发现结果是一样的
请问这两句有什么区别?
引用(别名)与原变量是一样的,一个修改后,另一个也会修改。
如果在函数内部,使用global $var,那么如果函数内部把$var赋值为一个具体的常数或者一个变量,那么外部的$var会改变。而如果内部把$var赋值为一个变量的引用,那么外部$var的值不会改变。也就是说,不能在函数内部把全局变量赋值为一个引用。这是我自己总结的,请老大们指正。。
基于上面的原则,下面就容易理解了: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不会影响另一个。一点自己的想法,不过对楼主没用,一个人一个认识