PHP中unset销毁变量引发的问题

首先我们来看一个例子:

 代码如下 复制代码

<?php
    $a = "hello springload";
    $b = $a;
    unset($b);
    echo $a; //hello springload
?>

这个我们很清楚,unset($b),只是断开了变量名和值得绑定,但是一个有意思的问题出现了:

 代码如下 复制代码

<?php
    $a = "hello springload";
    $b = $a;
    unset($a);
    echo $b;//hello springload
?>

为什么$a销毁了,为嘛$b的值还在呢?

注:unset()函数只有当指向该值的所有变量(比如有引用变量指向该值)都被销毁后,地址才会被释放,如下:

 代码如下 复制代码

<?php
    $a = "hello springload";
    $b = $a;
    unset($a);
    unset($b);
    echo $b;//输出空
?>

时间: 2024-09-21 02:46:51

PHP中unset销毁变量引发的问题的相关文章

PHP中使用unset销毁变量并内存释放问题_php技巧

复制代码 代码如下: for ( $i = 1; $i < 100; $i++ ) { $str = str_repeat('01234567', $i); $a = memory_get_usage(); unset($str); $b = memory_get_usage(); echo "\n ".$i.': '.($b - $a).' Bytes.'; } 从结果看出: 8 x 32 = 256 在256字节长的时候才真正有必要释放内存,有些人说,不如直接$str = n

php unset()销毁单个或多个变量

例 1. unset() 示例  代码如下 复制代码 <?php // 销毁单个变量 unset ($foo); // 销毁单个数组元素 unset ($bar['quux']); // 销毁一个以上的变量 unset ($foo1, $foo2, $foo3); ?> unset() 在函数中的行为会依赖于想要销毁的变量的类型而有所不同. 如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值.  代码如下 复制代码 &

Visual Studio 2008 、 Windows 环境变量介绍 和 如何在文件中引用环境变量 .

Visual Studio 2008  和 Windows 环境变量对设置 相对路径很重要,这样便于代码的移植,即使换一台计算机,代码不用更改配置,直接就能用. 可以在项目的"工具""属性页"对话框中任何接受字符串的位置使用这些宏.这些宏不区分大小写.  关于如何自己定义环境变量详见我的另一文章:http://blog.csdn.net/jtop0/article/details/7574139     宏 说明 $(RemoteMachine) 在"调试

深入探讨Java多线程中的volatile变量_java

volatile 变量提供了线程的可见性,并不能保证线程安全性和原子性. 什么是线程的可见性: 锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility).互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据.可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 -- 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前

跪求大神-java中static定义变量

问题描述 java中static定义变量 运行结果为什么是0不是1? 解决方案 因为你定义了参数x 根据就近原则,你的x++访问的是这个参数x变量,而不是成员变量x 解决方案二: 因为你的参数名也叫x,x++ 这里是将参数x自增,不是全局变量x. 所以全局变量x里面的值还是0. 解决方案三: class Test { public static int x = 9; public static void name(int x) { x ++; System.out.println(x); //为

java中为什么有的变量声明而不赋值?

问题描述 java中为什么有的变量声明而不赋值? java中为什么有的变量声明而不赋值?而有的就值,那什么情况下要赋值,什么情况下不赋值 解决方案 比如对象变量,而调用这个变量的构造函数非常耗费时间,所以我们等用到的时候再创建,如果程序运行完都不访问它,就根本不创建,这样可以提高效率. 对于简单变量,比如int float一类的,建议随手给一个初始值. 解决方案二: 你这个问题给你举个例子,你应该就能理解了 例如: int a; 这是只声明不赋值,则只会在内存的栈区创建引用,堆中并无此引用的指向

浅谈php中include文件变量作用域

本文给大家总结了php中include文件时的几种情况下的作用域,十分的简单实用,希望对大家熟悉include的使用能够有所帮助. 在php中我们有时候需要include一个文件.比如我前段时间在写一个框架的时候,打算用原生的php作为模板,然后写一个display方法引入模板文件就可以,但是这只是我的意淫而已. 写完后发现在模板中所有的变量都提示未定义.通过各种研究和查找资料,总结了include文件时的几种情况下的作用域. 第一种情况:A文件include B文件,在B文件中可以调用A中的变

应用-dw中,阶段变量添加后为什么绑定不显示

问题描述 dw中,阶段变量添加后为什么绑定不显示 ADODB.Command 错误 '800a0d5d' 应用程序在当前操作中使用了错误类型的值. /order_ch.asp,行 38 MM_editCmd.Parameters.Append MM_editCmd.CreateParameter(""param5"" 5 1 -1 MM_IIF(Request.Form(""price"") Request.Form(&quo

vb中,用变量作为数组名可以吗

问题描述 vb中,用变量作为数组名可以吗 vb中,用变量作为数组名可以吗? 例如 arrrrstr()=("as","se") for i=0 to 1 for j=1 to 25 linestr=aeerrstr(i)(j)&"," next j next i 解决方案 将arrstr(i)作为变量名?可以的 解决方案二: 好久不用VB了, 好像是這樣的 dim arrrrstr(2,25) as string 解决方案三: Agoni