全局和静态变量的引用

在 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() 函数时其值并没有被记住。
### 定义 - **全局变量**:全局变量是在程序的全局作用域内定义的变量,它可以在程序的任何地方被访问修改。在不同的编程语言中,全局变量的定义方式有所不同。例如,在Python中,在函数外部定义的变量就是全局变量: ```python # 定义全局变量 global_variable = 10 def print_global_variable(): print(global_variable) print_global_variable() # 输出: 10 ``` - **静态变量**:静态变量通常是指在类中定义的具有静态属性的变量,它属于类本身而不是类的实例。在Java中,使用`static`关键字来定义静态变量: ```java public class StaticVariableExample { // 定义静态变量 static int staticVariable = 20; public static void main(String[] args) { System.out.println(StaticVariableExample.staticVariable); // 输出: 20 } } ``` ### 区别 - **作用域**:全局变量的作用域是整个程序,而静态变量的作用域通常是定义它的类内部。全局变量可以在程序的任何函数或类中被访问,而静态变量需要通过类名来访问(在类外部)。 - **生命周期**:全局变量的生命周期是整个程序的运行期间,从程序开始到结束一直存在。静态变量的生命周期也是整个程序的运行期间,但它是与类相关联的,只要类被加载到内存中,静态变量就存在。 - **存储位置**:全局变量静态变量通常都存储在数据段中,但具体的存储细节可能因编程语言操作系统而异。 - **实例关联**:全局变量与类或对象没有直接关联,而静态变量是类的属性,所有类的实例共享同一个静态变量。 ### 使用场景 - **全局变量**:全局变量适用于需要在多个模块或函数之间共享数据的场景,例如配置信息、系统状态等。但过多使用全局变量会导致代码的可维护性可测试性降低,因为全局变量的修改可能会影响到程序的其他部分。 - **静态变量**:静态变量常用于存储类级别的信息,如类的实例计数、常量等。例如,在一个数据库连接类中,可以使用静态变量来记录当前的连接数: ```java public class DatabaseConnection { // 静态变量记录连接数 static int connectionCount = 0; public DatabaseConnection() { connectionCount++; } public static int getConnectionCount() { return connectionCount; } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值