返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >深入理解php中unset()
  • 317
分享到

深入理解php中unset()

2024-04-02 19:04:59 317人浏览 泡泡鱼
摘要

目录概述变化情况情况一:情况二:情况三:概述 unset()经常会被用到,用于销毁指定的变量,但它有自己的行为模式,如果不仔细的话可能会被中文解释给迷惑: 先来看看官方文档的说法:

概述

unset()经常会被用到,用于销毁指定的变量,但它有自己的行为模式,如果不仔细的话可能会被中文解释给迷惑:

先来看看官方文档的说法:

unset  —— unset a given variable

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

parameters:

var:The variable to be unset.    //要unset的变量

...:Another variable ... //其他需要unset的变量

return Values:No value is returned.    //unset不返回值

Because this is a language construct and not a function,it cannot be called using variable functions.

//unset()是语言结构,不是函数,因此不能被函数变量调用,具体参照函数变量。

使用function_exists('unset')返回的false,以此证明unset并不是一个函数,所以无法使用$fun='unset';$fun()的方式调用unset()

It is possible to unset even object properties visible in current context.

//通用环境下unset可以销毁对象或者对象的可见属性(public)

It is not possible to unset $this inside an object method since PHP5

php5之前unset无法销毁对象中的$this方法

when using unset() on inaccessible  object properties,the __unset() overloading method will be called,if declare.

当unset()无法销毁对象中的属性,例如私有属性,保护属性,那么会自动加载对象中的__unset方法。

description:

unset() destroys the specified variables.     //unset()销毁指定的变量

The behavior of unset() inside of a function can vary dependiing on what type of variable you are attempting to destroy.

//unset()的行为在函数内部可以根据你所指定销毁的变量类型变化。

变化情况

情况一:

if a globalized variable is unset() inside of a function,only the local variable is destroyed.The variable in the calling environment will retain the same value as before unset() was called.

如果在函数内一个使用global使其全局化的变量,使用unset进行销毁,那么只有局部的变量会被销毁,在调用环境的变量将会保留没有使用unset()销毁之前的调用的变量值。

the example:


<?php
function destroy_foo() 
{
    global $foo;
    unset($foo);
}
$foo = 'bar';
destroy_foo();
echo $foo;
?>

the above example will output:bar

这是官方文档的例子,可能这样还是不太明显,把上面的例子改成下面这样,一切就很清晰了。


<?php 
function des(){
	global $foo;
	$foo='bars';
	unset($foo);
	echo $foo;
}
$foo='bar';
echo "The globalized variable is unset() inside of a function:";
des();
echo "<br/>";
echo "The variable in the calling environment:";
echo $foo;

上面的例子会返回如下结果:

可以看到函数内echo $foo会得到错误提示该变量没有定义,因为unset将$foo在函数内的局部变量销毁了。

而外部调用环境的$foo仍保留着没有被unset进行销毁,上面官方描述上写了调用环境的$foo将保留的是在使用unset()前的变量值,因此echo出bars,而不是bar。

to unset() a global variable inside of a function,then use the $GLOBALS array to do so.

如果要用unset()销毁函数中的全局变量,应该使用$GLOBALS数组形式


function destroy_foo(){
	unset($GLOBALS['foo']);
}
$foo = 'bar';
destroy_foo();
echo $foo;

the above example whill output: Notice: Undefined variable: foo in ...

延伸:

这里可以明确一点,函数内global修饰的变量$var会使其全局化,但和$GLOBALS['var']性质不同,虽然他们都是使用的外部调用环境的$var,但是函数内global $var里保存的只是外部环境调用变量$val的一个指针或者同名引用,而$GLOBALS['var']是外部调用环境$var本身,因此unset在函数内对两者进行销毁会产生上面例子的不同的原因,前者销毁的只是保存同名引用或者指针的变量$var,后者销毁的是外部调用变量$var本身。

情况二:

if a variable  that is PASSED BY REFERENCE is unset() inside of a function,only the local variable is destroyed.The variable in the calling environment will retain the same value as before unset() was called.

如果一个被引用的函数在函数内部使用unset()进行销毁,那么只有函数内部的局部变量被销毁,而调用环境变量仍然会保留unset()之前被调用的值。


<?php 
function foo(&$bar){
	unset($bar);
	$bar="blah";
}
$bar='something';
echo $bar."\n";
foo($bar);
echo $bar."\n";

The above example will output:something something

这个和上面global其实很相似,函数内部引用的变量$bar其实保存的是外部环境变量$bar的指针或者说外部变量$bar的引用,因此unset在函数内部销毁的并不是外部环境调用的变量,因此外部环境调用的变量$bar还存在。

情况三:

if a static variable is unset() inside of a function,unset() destroys the variable only in the context of the rest of a function.Following calls will restore the previous value of a variable.

如果是函数内部的静态变量使用unset(),unset()销毁掉函数内部的静态变量,但是下次调用会恢复之前该静态变量的值。
为了更明显,下面的例子进行对比,这里对官方的范例进行了修改对比:


<?php 
function fun1(){
	static $count=0;
	$count++;
	echo "before:".$count." ";
	$count='2';
	echo "after".$count." ";
}
for($i=0;$i<5;$i++){
	fun1();
	echo "<br/>";
}

output: 

下面使用unset:


<?php 
function fun1(){
	static $count=0;
	$count++;
	echo "before:".$count." ";
	unset($count);
	$count='2';
	echo "after".$count." ";
}
for($i=0;$i<5;$i++){
	fun1();
	echo "<br/>";
}

output: 

两个对比可以看出,unset只是将函数内部的静态变量进行了销毁,但没有销毁储存在内存里的该静态变量的值,因为在函数内部用static声明的静态变量存储的仅仅是指向内存存储该静态变量的一个指针,因此unset()销毁的时候也仅仅是销毁了该指针,但存储在内存里的静态变量值没有受到影响,因此再次调用该函数的时候,static该变量再次建立了与内存中该变量的指针关系,而上一次调用时unset()之前的该变量值依旧存在,因此会恢复该变量上一次的值,因此$count进行了递增。

以上就是深入理解php中unset()的详细内容,更多关于php unset()的资料请关注编程网其它相关文章!

--结束END--

本文标题: 深入理解php中unset()

本文链接: https://lsjlt.com/news/123940.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 深入理解php中unset()
    目录概述变化情况情况一:情况二:情况三:概述 unset()经常会被用到,用于销毁指定的变量,但它有自己的行为模式,如果不仔细的话可能会被中文解释给迷惑: 先来看看官方文档的说法: ...
    99+
    2024-04-02
  • 深入理解 PHP 中的点操作符
    深入理解 PHP 中的点操作符,需要具体代码示例 PHP 是一种常用的服务器端脚本语言,许多网站和应用程序都使用 PHP 来开发。在 PHP 中,点操作符(.)是一个非常常用的操作符,...
    99+
    2024-04-02
  • 深入理解PHP中的值传递机制
    深入理解PHP中的值传递机制 PHP是一种流行的服务器端脚本语言,广泛应用于Web开发领域。在PHP中,有两种传递参数的方式:值传递(pass by value)和引用传递(pass ...
    99+
    2024-03-08
    理解深入 php值传递 传递机制
  • 深入理解PHP中的多态性特性
    多态性是面向对象程序设计中的重要概念之一,它允许不同对象使用同一个方法名称进行不同的操作。在PHP中,多态性通过继承和实现接口来实现。本文将深入探讨PHP中多态性的特性,并通过具体的代...
    99+
    2024-04-02
  • 深入理解 PHP Stream 的工作原理
    PHP Stream 是 PHP 内置的一个重要特性,它提供了灵活的文件读写操作,允许 PHP 脚本以各种方式操作输入和输出数据流。本文将深入探讨 PHP Stream 的工作原理,并...
    99+
    2024-04-02
  • 深入理解 PHP 中文字符编码转换
    在今天的互联网时代,PHP作为一种广泛应用的服务器端脚本语言,被用于开发各种网站和web应用程序。在处理用户输入以及与数据库交互过程中,中文字符编码转换是一个不可避免的问题。本文将深入...
    99+
    2024-04-02
  • 深入理解PHP中的私有静态方法
    深入理解PHP中的私有静态方法 在PHP中,静态方法是一种可以直接通过类而不是实例来调用的方法。而私有静态方法则是一种只能在类的内部调用,无法被外部程序调用的方法。在本文中,我们将深入...
    99+
    2024-04-02
  • 深入理解Think PHP路由配置
    深入理解Think PHP路由配置,需要具体代码示例 Think PHP 是一款基于MVC模式的PHP框架,其路由配置是框架中非常重要的一部分。了解和掌握路由配置可以帮助开发者更好地组...
    99+
    2024-04-02
  • PHP 设计模式的深入理解
    设计模式是可重复使用的软件设计解决方案,用于解决常见问题,提高代码可维护性、可扩展性和可重用性。php 中常见的设计模式包括:单例模式:确保一个类只创建一次实例。工厂模式:根据输入创建对...
    99+
    2024-05-06
    php 设计模式
  • 深入解析php中的class(类)
    PHP是一种流行的编程语言,其中面向对象编程(OOP)是其最强大的特性之一。PHP Class是OOP中的核心概念,它提供了一种封装数据和行为的机制。这些Class为我们提供了可重用的代码,减少了代码冗余并提高了代码的可维护性。本文将介绍P...
    99+
    2023-05-14
    class php
  • 深入理解Java中的HashMap
    目录一、HashMap的结构图示二、HashMap的成员变量以及含义2.1、hash方法说明2.2、tableSizeFor方法说明三、HashMap的构造方法四、HashMap元素...
    99+
    2024-04-02
  • 深入理解html5中的position
    在HTML5中,position属性用于控制元素在文档中的定位方式。它有四个可选值:static(默认值)、relative、fix...
    99+
    2023-09-14
    html5
  • 深入理解Pytorch中的torch.matmul()
    目录torch.matmul()语法作用举例情形1: 一维 * 一维情形2: 二维 * 二维情形3: 一维 * 二维情形4: 二维 * 一维情形5:两个参数至少为一维且至少一个参数为...
    99+
    2023-05-15
    Pytorch torch. matmul() torch. matmul()
  • Android 中ThreadLocal的深入理解
    ThreadLocal前言:    ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,ThreadLocal是一个线程内部的数据存储类...
    99+
    2023-05-30
    android threadlocal roi
  • 深入理解vue3中的reactive()
    目录开始调试复杂数据类型基本数据类型proxy对象ref类型Map类型和Set类型在vue3的开发中,reactive是提供实现响应式数据的方法。日常开发这个是使用频率很高的api。...
    99+
    2023-02-17
    vue3 reactive() vue  reactive
  • 深入理解Python中的__builti
    0.说明        这里的说明主要是以Python 2.7为例,因为在Python 3+中,__builtin__模块被命名为builtins,下面主要是探讨Python 2.x中__builtin__模块和__builtins__模块...
    99+
    2023-01-31
    Python __builti
  • 深入理解python中的ThreadLocal
    ThreadLocal在threading模块中,可以见得它是为我们的线程服务的。 它的主要作用是存储当前线程的变量,各个线程之间的变量名是可以相同的,但是线程之间的变量是隔离的,也...
    99+
    2023-03-08
    python ThreadLocal
  • JavaWeb中Servlet的深入理解
    1.servlet:定义: 接口 2.配置servlet: public class HelloServlet extends HttpServlet {} HttpServlet...
    99+
    2024-04-02
  • 怎么区分PHP中的unset和array_splice
    这篇文章给大家分享的是有关怎么区分PHP中的unset和array_splice的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.使用的函数a.函数unset()unset ( mixed&n...
    99+
    2023-06-14
  • php中unset函数的使用方法
    这篇文章主要讲解了“php中unset函数的使用方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php中unset函数的使用方法”吧!说明unset函数可以释放给定的变量。通过使用该函数,...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作