同样是PHP5手册上的
请求解答
在变量的变量范围小节
全局和静态变量的引用
在 Zend 引擎 1 代,它驱动了 PHP4,对于变量的 static 和 global 定义是以 references 的方式实现的。例如,在一个函数域内部用 global 语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用。这有可能导致预料之外的行为,如以下例子所演示的:
<?php
function test_global_ref() {
global $obj;
$obj = &new stdclass;
}function test_global_noref() {
global $obj;
$obj = new stdclass;
}test_global_ref();
var_dump($obj);
test_global_noref();
var_dump($obj);
?>
执行以上例子会导致如下输出: NULL
object(stdClass)(0) {
} 类似的行为也适用于 static 语句。引用并不是静态地存储的:
<?php
function &get_instance_ref() {
static $obj; echo 'Static object: ';
var_dump($obj);
if (!isset($obj)) {
// 将一个引用赋值给静态变量
$obj = &new stdclass;
}
$obj->property++;
return $obj;
}function &get_instance_noref() {
static $obj; echo 'Static object: ';
var_dump($obj);
if (!isset($obj)) {
// 将一个对象赋值给静态变量
$obj = new stdclass;
}
$obj->property++;
return $obj;
}$obj1 = get_instance_ref();
$still_obj1 = get_instance_ref();
echo "\n";
$obj2 = get_instance_noref();
$still_obj2 = get_instance_noref();
?>
执行以上例子会导致如下输出: Static object: NULL
Static object: NULLStatic object: NULL
Static object: object(stdClass)(1) {
["property"]=>
int(1)
} 上例演示了当把一个引用赋值给一个静态变量时,第二次调用 &get_instance_ref() 函数时其值并没有被记住。
请求解答
在变量的变量范围小节
全局和静态变量的引用
在 Zend 引擎 1 代,它驱动了 PHP4,对于变量的 static 和 global 定义是以 references 的方式实现的。例如,在一个函数域内部用 global 语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用。这有可能导致预料之外的行为,如以下例子所演示的:
<?php
function test_global_ref() {
global $obj;
$obj = &new stdclass;
}function test_global_noref() {
global $obj;
$obj = new stdclass;
}test_global_ref();
var_dump($obj);
test_global_noref();
var_dump($obj);
?>
执行以上例子会导致如下输出: NULL
object(stdClass)(0) {
} 类似的行为也适用于 static 语句。引用并不是静态地存储的:
<?php
function &get_instance_ref() {
static $obj; echo 'Static object: ';
var_dump($obj);
if (!isset($obj)) {
// 将一个引用赋值给静态变量
$obj = &new stdclass;
}
$obj->property++;
return $obj;
}function &get_instance_noref() {
static $obj; echo 'Static object: ';
var_dump($obj);
if (!isset($obj)) {
// 将一个对象赋值给静态变量
$obj = new stdclass;
}
$obj->property++;
return $obj;
}$obj1 = get_instance_ref();
$still_obj1 = get_instance_ref();
echo "\n";
$obj2 = get_instance_noref();
$still_obj2 = get_instance_noref();
?>
执行以上例子会导致如下输出: Static object: NULL
Static object: NULLStatic object: NULL
Static object: object(stdClass)(1) {
["property"]=>
int(1)
} 上例演示了当把一个引用赋值给一个静态变量时,第二次调用 &get_instance_ref() 函数时其值并没有被记住。
$obj = &new stdclass;
new stdclass;是一个函数内部变量,生命周期只在函数内部.所以指向这块内存的指针在离开函数外是不存在的.
等于
$tmp = new stdclass;
$obj = &$tmp;
所以
$tmp 是内部变数
而
$obj 指向 $tmp
因此
function 完结后, $obj会指向被清空的 $tmp令我又爱又恨的指针 =_=
内部的变量
是 局部变量
只能在函数内部起作用这个我可以理解但是剩下的不理解了