PHP unset函数原理及使用方法解析

unset—释放给定的变量

说明

unset(mixed$var[,mixed$...] ) :void

unset()销毁指定的变量。

unset()在函数中的行为会依赖于想要销毁的变量的类型而有所不同。

如果在函数中unset()一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用unset()之前一样的值。

<?php
function destroy_foo() {
  global $foo;
  unset($foo);
} 

$foo = 'bar';
destroy_foo();
echo $foo;
?>

以上例程会输出:

bar

如果您想在函数中unset()一个全局变量,可使用$GLOBALS数组来实现:

<?php
function foo()
{
  unset($GLOBALS['bar']);
} 

$bar = "something";
foo();
?>

如果在函数中unset()一个通过引用传递的变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用unset()之前一样的值。

<?php
function foo(&$bar) {
  unset($bar);
  $bar = "blah";
} 

$bar = 'something';
echo "$barn"; 

foo($bar);
echo "$barn";
?>

以上例程会输出:

something
something

如果在函数中unset()一个静态变量,那么在函数内部此静态变量将被销毁。但是,当再次调用此函数时,此静态变量将被复原为上次被销毁之前的值。

<?php
function foo()
{
  static $bar;
  $bar++;
  echo "Before unset: $bar, ";
  unset($bar);
  $bar = 23;
  echo "after unset: $barn";
} 

foo();
foo();
foo();
?>

以上例程会输出:

Before unset: 1, after unset: 23
Before unset: 2, after unset: 23
Before unset: 3, after unset: 23

参数

var

要销毁的变量。

...

其他变量……

返回值

没有返回值。

范例

Example #1unset()示例

<?php
// 销毁单个变量
unset ($foo);

// 销毁单个数组元素
unset ($bar['quux']);

// 销毁一个以上的变量
unset($foo1, $foo2, $foo3);
?>

Example #2 使用(unset)类型强制转换

(unset)类型强制转换常常和函数unset()引起困惑。 为了完整性,(unset)是作为一个NULL类型的强制转换。它不会改变变量的类型。

<?php
$name = 'Felipe';

var_dump((unset) $name);
var_dump($name);
?>

以上例程会输出:

NULL
string(6) "Felipe"

注释

  • Note:因为是一个语言构造器而不是一个函数,不能被可变函数调用。
  • It is possible to unset even object properties visible in current context.
  • 在 PHP 5 之前无法在对象里销毁$this。
  • 在unset()一个无法访问的对象属性时,如果定义了__unset()则对调用这个重载方法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2020-08-14

php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法

10.__set() __get() __isset() __unset()四个方法的应用 一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是,对属性的读取 和赋值操作是非常频繁的,因此在PHP5 中,预定义了两个函数"__get()"和"__set()"来获 取和赋值其属性,以及检查属性的"__isset()"和删除属性的方法"__unset()". 上一节中,我们为每个属性做了设置和获取的方法,在PHP

php使用unset()删除数组中某个单元(键)的方法

本文实例讲述了php使用unset()删除数组中某个单元(键)的方法.分享给大家供大家参考.具体分析如下: unset既可以删除变量,也可以删除数组中某个单元.但要注意的是,数组不会重建索引. 实例如下: <?php $arr = array("朝阳区","海淀区","西城区","东城区","丰台区"); unset($arr[3]); echo "<pre>"; pr

PHP中删除变量时unset()和null的区别分析

第一种方法:$varname=null 第二种方法:unset($varname) 这两种方法都可以删除变量,但结果有些许的差别. 代码: 复制代码 代码如下: <?php $a = array( 'a' => 'a', 'b' => 'b' ); $b = array( 'a' => 'a', 'b' => 'b' ); $a['b'] = null; unset($b['b']); print('<pre>'); print_r($a); print('<

解析PHP中的unset究竟会不会释放内存

首先让我们看一个例子 复制代码 代码如下: var_dump(memory_get_usage());    $a = "laruence";    var_dump(memory_get_usage());    unset($a);    var_dump(memory_get_usage()); 输出(在我的个人电脑上, 可能会因为系统,PHP版本,载入的扩展不同而不同):    int(90440)    int(90640)    int(90472 注意到 90472-90

PHP中unset,array_splice删除数组中元素的区别

如果要在某个数组中删除一个元素,可以直接用的unset,但是数组的索引不会重排: <?php $arr = array('a','b','c','d'); unset($arr[1]); print_r($arr); ?> 结果是: Array ( [0] => a [2] => c [3] => d )   那么怎么才能做到缺少的元素会被填补并且数组会被重新索引呢?答案是array_splice(): <?php $arr = array('a','b','c','d

php中is_null,empty,isset,unset 的区别详细介绍

is_null, empty, isset, unset 我们先来看看这4个函数的描述. isset 判断变量是否已存在(配置)unset 把变量删除(释放)掉empty 判断变量是否为空is_null 判断变量是否为NULLok,已经开始搞人了.那么开始,这4个函数中除了unset,其他3个都是判断函数,unset首先出局,因为他不会搞错,其次是is_null,我们可以把它看成是!isset,是isset的一个逆操作,下面一张表可以很清楚的说明他们之间的关系: 复制代码 代码如下: 变量   

PHP中isset()和unset()函数的用法小结

isset(PHP 3, PHP 4, PHP 5 ) isset -- 检测变量是否设置 描述bool isset ( mixed var [, mixed var [, ...]])如果 var 存在则返回 TRUE,否则返回 FALSE. 如果已经使用 unset() 释放了一个变量之后,它将不再是 isset().若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE.同时要注意的是一个 NULL 字节("\0")并不等同于 PHP 的 NULL 常数.

PHP魔术方法__ISSET、__UNSET使用实例

__isset()   – 在对类中属性或者非类中属性使用isset()方法的时候如果没有或者非公有属性,则自动执行__isset()的方法 __unset() - 在对类中属性或者非类中属性使用unset()方法的时候如果没有或者非公有属性,则自动执行__unset()的方法 复制代码 代码如下: <?php     /**      * 针对类中的魔术方法 __isset() 和 __unset() 的例子      */ class Example {     public $public

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

复制代码 代码如下: 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内存释放以及垃圾回收

引用赋值 $a = 'apple'; $b = &$a; 上述代码中,我将一个字符串赋值给变量a,然后将a的引用赋值给了变量b.显然,这个时候的内存指向应该是这样的: $a -> 'apple' <- $b a和b指向了同一块内存区域,我们通过 var_dump($a, $b) 得到 string(5) "apple" string(5) "apple" ,这是我们预期的结果. unset 函数 假如我想将 'apple' 这个字符串从内存中释放

浅析C/C++变量在内存中的分布

C/C++变量在内存中的分布在笔试时经常考到,虽然简单,但也容易忘记,因此在这作个总结,以加深印象. 先写一个测试程序: 复制代码 代码如下: #include <stdio.h>  #include <malloc.h>  int g_i = 100;  int g_j = 200;  int g_k, g_h;  int main()  {      const int MAXN = 100;      int *p = (int*)malloc(MAXN * sizeof(i

C语言中变量与其内存地址对应的入门知识简单讲解

先来理解理解内存空间吧.请看下图: 如上图所示,内存只不过是一个存放数据的空间,就好像我的看电影时的电影院中的座位一样.电影院中的每个座位都要编号,而我们的内存要存放各种各样的数据,当然我们要知道我们的这些数据存放在什么位置吧.所以内存也要象座位一样进行编号了,这就是我们所说的内存编址.座位可以是遵循"一个座位对应一个号码"的原则,从"第1号"开始编号.而内存则是按一个字节接着一个字节的次序进行编址,如上图所示.每个字节都有个编号,我们称之为内存地址.好了,我说了这

浅析Java中局部变量与成员变量同名解决技巧

要想区分这哥俩,首先,我们得知道它们分别是什么.先从成员变量下刀. 成员变量 我们来研究一个事物: 属性:外在特征:例如人的身高,体重 行为:能够做什么:例如人有说话,打球等行为. 而在Java语言中,最基本的单位是类,类就是用来体现事物的. 用类class来描述事物也是如此: 属性:对应类中的成员变量 行为:对应类中的成员函数 定义类其实就是在定义类中的成员(成员变量和成员函数) 拓展:类是一个抽象的概念,而对象就是类的具体的存在,体现.例如:生活中的汽车,可以看做一个类,我们称之为汽车类,每

Java中对象的销毁方法分析

本文较为详细的分析了Java中对象的销毁方法.分享给大家供大家参考.具体分析如下: Java中的基本数据类型变量和对象的名称引用变量如定义在方法中,都为局部变量.但对象本身不一定是局部生命周期.如函数外存在其他对该对象的引用变量,则该对象的生命周期延伸至该其他引用变量所在的块. 如从被调用函数参数引用传值或返回值到主调用函数所在的对象类型变量中,则该对象都仍存在(但被调用函数的该对象的引用变量生命周期结束,因此引用变量是局部变量),此时对象突破了局部变量的局部生命期. Java对象销毁 Java

详解Java中synchronized关键字的死锁和内存占用问题

先看一段synchronized 的详解: synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行.另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 二.然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以

Swift中的常量和变量简单概述

1.在Swift中规定:在定义一个标识符时必须明确说明该标识符是一个常量还是变量 2.使用let来定义常量,定义之后不可以修改 3.使用var来定义变量,定义之后可以修改 4.定义常量和变量 常量:let 标识符的名称 : 类型 = 赋值 变量:var 标识符的名称 : 类型 = 赋值 5.类型的首字母要大写,常量与变量名不能包含数学符号,箭头 6.常量的使用注意 6.1 在开发中,apple建议优先使用常量,只有发现需要修改时再改成变量,因为常量更加安全,不会被任意的修改 6.2 常量的本质.

Linux C中多线程与volatile变量

Linux C中多线程与volatile变量 volatile 修饰的变量表示改变量的值是易变的,编译器不对其进行优化,访问该变量的时候不会从寄存器读取, 而是直接从内存读取变量. 在多线程环境下,每个线程都有一个独立的寄存器,用于保存当前执行的指令.假设我们定义了一个全局变量,每个线程都会访问这个全局变量,这时候线程的寄存器可能会存储全量变量的当前值用于后续的访问.当某个线程修改了全局变量的值时,系统会立即更新该线程寄存器中对应的值,其他线程并不知道这个全局变量已经修改,可能还是从寄存器中获取