全局和静态变量的引用

在 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: NULL

Static object: NULL

Static object: object(stdClass)(1) {

["property"]=>

int(1)

}

上例演示了当把一个引用赋值给一个静态变量时,第二次调用 &get_instance_ref() 函数时其值并没有被记住。