在 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() 函数时其值并没有被记住。
分享到:
相关推荐
- **面向对象设计中的static**关键字用于定义类的静态成员变量和静态成员函数,这些成员与类本身相关,而不是与某个特定对象实例相关。 理解这些变量类型及其特点有助于编写更高效、更安全的代码。
- 设计和使用访问静态变量的函数时,需考虑重入问题,因为静态变量都位于静态数据存储区,全局可见。 - 需要一个可重入的函数时,应避免在函数中使用`static`变量,以免出现内部存储器问题。 - 当函数返回值为指针...
在WPF中,我们可能会遇到需要将控件与这样的全局状态关联的情况,这时绑定到静态变量就变得很有用。 在WPF中,数据绑定是通过`{Binding}`标记扩展或代码-behind来实现的。绑定到静态变量的步骤如下: 1. **定义...
3. 全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。 4. 文字常量...
在A中定义有全局变量X(或类的静态成员变量),则在动态库B中访问的X,与可执行程序C中访问的X是同一个变量还是两个不同的变量? 答案:是两个不同的变量。 2. 工程中包含动态库A,动态库B,可执行程序C。C依赖于A和...
2. **生命周期**:全局变量和静态全局变量在整个程序运行期间都存在,而局部变量和非静态局部变量在其所属函数调用结束后即被销毁。 3. **初始化和存储位置**:静态局部变量和静态全局变量在程序加载时只初始化一次...
静态变量分为静态局部变量和静态全局变量。静态局部变量只在函数首次调用时初始化,之后每次调用函数时,其值会保留,不会被重置。静态全局变量只在定义它的源文件内可见,避免了全局变量的命名冲突,且其生命周期...
在本文中,我们将深入探讨如何在Windows Presentation Foundation (WPF) 中绑定静态变量,并...通过实践和理解这个示例,你可以更好地掌握WPF中的静态变量绑定和数据转换技术,这将对开发功能丰富的WPF应用大有裨益。
全局变量、局部变量、静态变量三者的区别。
- **全局变量和静态变量**:如果未手动初始化,则由编译器自动初始化为0。 - **局部变量**:如果不进行初始化,则其值是不确定的,具体取决于编译器的实现细节。 #### 五、示例分析 下面通过一个具体的代码示例来...
方法二:使用静态变量和静态函数 静态成员变量在类的所有实例间共享,无论创建了多少实例,它们都只有一个副本。静态成员函数可以直接通过类名调用,无需实例化对象。这使得它们在全局访问方面非常方便。例如: ``...
五、静态变量和静态函数 静态全局变量的作用域限制在定义该变量的源文件内,避免在其它源文件中引起错误。static 局部变量只被初始化一次,下一次依据上一次结果值。static 函数在内存中只有一份,普通函数在每个被...
它们根据其定义的位置和特性,可以分为几种不同的类型:局部变量、全局变量、局部静态变量和全局静态变量。这些变量各有其特点和作用域,理解它们之间的区别对于编写高效且无误的C++代码至关重要。 1. 局部变量...
- **注意事项**: 静态变量有助于减少全局变量的使用,提高程序的可维护性。 #### 二、存储空间分配 - **全局变量**和**静态全局变量**: - **位置**: 静态存储区(数据段)。 - **特性**: 在程序的整个运行过程中都...
静态变量和非静态变量是 C# 语言中两种不同的变量类型。静态变量是在应用程序初始化时创建的,直到应用程序结束时才销毁。非静态变量则需要被实例化后才会分配内存。 1. 内存分配:静态变量在应用程序初始化时创建...
python局部变量全局变量-静态方法-实例变量静态变量代码解析。
在iOS开发中,Block、局部变量、全局变量和静态变量(`static`)是编程中常见的概念,它们各自有自己的特点和用途,同时在特定情况下,它们之间也存在一定的联系。让我们详细探讨一下这些知识点。 首先,Block是...
4. 在函数内部可以使用global关键字来引用全局静态变量,并对其值进行修改,但这样做会降低函数的独立性和可重用性。 为了更好地理解局部静态变量和全局静态变量的应用场景,我们可以参考代码示例。在局部静态变量...
而对于全局静态变量,其作用域为整个源文件。 现在,让我们来看如何利用静态变量来计数函数的访问次数。假设我们有一个函数`countAccess()`,我们想记录它被调用的次数。可以这样做: ```cpp #include void ...
在C++编程中,"静态"一词有多种含义,主要涉及到静态全局变量、静态数据成员和静态成员函数。这些特性在程序设计中扮演着重要角色,尤其在数据结构和算法实现时。以下是对这些概念的详细解释: 1. 静态全局变量: ...