$GLOBALS与global区别 变量销毁机制

2024-09-05 18:32

本文主要是介绍$GLOBALS与global区别 变量销毁机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码一:

<?php
$var1 = 1;
function test1(){global $var1;  #等价于 $var1 = &$GLOBALS['var1']; 这里的$var1跟外面的$var1是不同的指针,但指向同样的数据unset($var1);   #当你unset一个引用,只是断开了变量名和变量内容之间的绑定,这并不意味着变量内容被销毁了.echo $var1;     #PHP Notice:  Undefined variable: var1
}
test1();
echo $var1;    #此处输出1

代码二:

<?php
$var1 = 1;
function test1(){global $var1;unset($GLOBALS['var1']);echo $var1;  #输出1
}test1();
echo $var1;  #PHP Notice:  Undefined variable: var1

结论:

1$GLOBALS['var2'] 和外部的 $var2 是同一个指针,指向存储值为2的内存地址
2global $var1 是外部的 $val1 的指针的一个复制指针,也指向存储值为1的内存地址(同引用符号&)
3、无论$GLOBALS['var1']或者global $var1,因为指向的值内存地址一样,所以都可以修改外部变量的值。所以:
unset($GLOBALS['var1']) 操作同时销毁了外部的 $var1
test1 函数下进行 global $val1; unset($val1) 不会销毁外部的$var1

php 变量管理符号表(php以符号表的形式管理变量):

php符号表理解:运行中所有变量名称都记录在里面,php来维护,具体的数据存储在内存中,php就是根据这个符号表去回收没有用到的变量空间的,释放内存空间

这里写图片描述

当你unset一个变量,只是断开了变量名和变量内容之间的绑定,这并不意味着变量内容被销毁了.此时如上图所示,unset时符号表对应的refcount - 1  当 refcount = 0 时,php才会启动垃圾回收,真正释放内存
php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。通俗的讲 1:如果有下面的代码 $a="ABC"; $b=$a; 其实此时 $a$b都是指向同一内存地址 而并不是$a$b占用不同的内存2:如果在上面的代码基础上再加上如下代码 $a="EFG";  由于$a$b所指向的内存的数据要重新写一次了,此时Zend核心会自动判断 自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储

这里写图片描述

这篇关于$GLOBALS与global区别 变量销毁机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139735

相关文章

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

GORM中Model和Table的区别及使用

《GORM中Model和Table的区别及使用》Model和Table是两种与数据库表交互的核心方法,但它们的用途和行为存在著差异,本文主要介绍了GORM中Model和Table的区别及使用,具有一... 目录1. Model 的作用与特点1.1 核心用途1.2 行为特点1.3 示例China编程代码2. Tab

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Spring中@RestController和@Controller的使用及区别

《Spring中@RestController和@Controller的使用及区别》:本文主要介绍Spring中@RestController和@Controller的使用及区别,具有很好的参考价... 目录Spring中@RestController和@Controller使用及区别1. 基本定义2. 使

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

Spring、Spring Boot、Spring Cloud 的区别与联系分析

《Spring、SpringBoot、SpringCloud的区别与联系分析》Spring、SpringBoot和SpringCloud是Java开发中常用的框架,分别针对企业级应用开发、快速开... 目录1. Spring 框架2. Spring Boot3. Spring Cloud总结1. Sprin

Java中的runnable 和 callable 区别解析

《Java中的runnable和callable区别解析》Runnable接口用于定义不需要返回结果的任务,而Callable接口可以返回结果并抛出异常,通常与Future结合使用,Runnab... 目录1. Runnable接口1.1 Runnable的定义1.2 Runnable的特点1.3 使用Ru

Java中Runnable和Callable的区别和联系及使用场景

《Java中Runnable和Callable的区别和联系及使用场景》Java多线程有两个重要的接口,Runnable和Callable,分别提供一个run方法和call方法,二者是有较大差异的,本文... 目录一、Runnable使用场景二、Callable的使用场景三、关于Future和FutureTa