PHP变量传值赋值和引用赋值,变量销毁
$a = 100;
$b = 200;
php中,上面代码中变量是怎么存放的呢?
此时若将b赋值给a,即
传值赋值 $a = $b; 和 引用赋值$a = &$b; 有什么区别呢?
传值赋值就是复制过去,然后各玩各的,互不影响。
引用赋值是两个变量指向一个盒子,一旦这样,一改俱改。
这样赋予变量a的就不仅仅是变量b的值,而是变量b的地址,变量a和变量b共同指向一个地址。
$a = 100;
$b = 200; $a = &$b; //变量a的指针指向变量b的数据盒子
var_dump($a,$b); //int(200) int(200) /*变量b引用赋值给变量a后,ab指向同一个地址,将会一改俱改,如下:*/
$a =500;
var_dump($a,$b); //int(500) int(500) 一改俱改: 改a也改了b
$b = 700;
var_dump($a,$b); //int(700) int(700) 一改俱改: 改b也改了a $c = 900;
$a = $c;
var_dump($a,$b); //int(900) int(900) 一改俱改:其他变量值复制给a,等同于直接改了盒子里的数据 $d = 1111;
$a = &$d;
var_dump($a,$b); //int(1111) int(900) 这里没有一改俱改,$a = &$d;是把变量d引用赋值给变量a,变量a指向了新地址,变成了新值1111,变量b还是指向老地址不变。
<?php
/*理解下面的话*/ $a = 100;
//变量a赋值int 100 ,100是基础数据类型,不是变量,新建一个盒子,里面存放int 100,让a指向它 $a = $b;
//变量b的值 赋值 给变量a,变量a,b各有各的指向,执行之后,各是各的。 $a = &$b;
//变量b的值的地址 赋值给变量 a ,变量a,b共用一个地址哦!一改俱改! ?>
销毁变量用unset
在php中,变量占据了两个地方,1.花名册中占个名字 2.存储其值的“盒子”(其实就是内存中一块地方)。
unset($a) ;会发生什么?
首先,会将$a这个变量扔出花名册,于是没有这个变量了。
其次,检查有没有其他变量也指向这个“盒子”,如果没有其他变量指向这个“盒子”,再检查盒子所占空间超过255字节长没?超过了,盒子才会被销毁(释放内存)没超过255字节,则不释放内存(销毁盒子)。
要想释放内存,可以用
$a = null;的方式,这样盒子被销毁了,但是中花名册中还有该变量哦!
/*引用赋值一改俱改,但是unset不是改盒子里的值,所以unset变量a,变量b没变化*/
$a = 200;
$b = &$a;
unset($a);
var_dump($a,$b); //NULL int(100)
上面的代码,执行到unset($a)时候,就是将变量a的指向断开,同时将变量a扔出花名册,从下图可以看出,对变量b是没有影响的。
但是,如果用$a = null;这种方式销毁变量时,将会有如下影响:
<?php
$a = 100;
$b = &$a;
$a = null;
var_dump($a,$b); //NULL NULL
?>
这种方式,释放了内存,但是共用一个地址的另一个变量也受到了影响。
看看这两种方式在数组上的应用:
<?php
$aaa = array(
'a'=>1,
'b'=>2
);
unset($aaa['a']);
print_r($aaa); //Array ( [b] => 2 ) ,用unset,扔出花名册,数组中这一项不存在了 $bbb = array(
'a'=>1,
'b'=>2
);
$bbb['a'] = null;
print_r($bbb); //Array ( [a] => [b] => 2 ) ,用 = null,数组中这一项还存在,只是值为空了
?>
PHP变量传值赋值和引用赋值,变量销毁的更多相关文章
- swift直接赋值与引用赋值都会触发willSet
class baseGoo{ var isScannerRunning = false { willSet{ print(newValue) } } var desp:String = "& ...
- PHP变量引用赋值与变量赋值变量的区别
变量默认总是传值赋值.那也就是说,当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量.这意味着,例如,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量 ...
- 细说PHP-5.3.4变量的引用赋值
变量总是传值赋值.也就是说,当讲一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量.这意味着,当一个变量的值赋予另个一变量时,改变其中一个变量的值,将不会影响到另一个变量.PHP中提供了 ...
- Golang对方法接收者变量的自动“取引用”和“解引用”
原文:https://blog.csdn.net/u014633283/article/details/83826413 --------------------------------------- ...
- 关于php变量的赋值和引用的区别
刚开始学习php,发现有些地方和js语法不同,所以记录下来. 这篇文章是总结php中变量赋值和引用的区别. 我们知道,js中,原始类型的赋值,是将值直接复制给变量:引用类型的赋值,是将内存地址复制给变 ...
- PHP:第一章——php中的变量001 /普通赋值/引用赋值/php变量的检查与销毁
<?php //php中的变量: //php中的变量用一个美元符$后面紧跟着变量名来表示,变量名是区分大小写的. //有效的变量只能是字母或者下划线开头,后面跟任意数量的字母.数字.或者下划线. ...
- Linux Shell编程变量赋值和引用
我们可以使用任意一种文字编辑器,比如gedit.kedit.emacs.vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行): #!/bin/sh ... 注意:最好使用“! ...
- Linux —— Shell编程之变量赋值和引用
Linux的shell编程是一种非常成熟的编程语言,它支持各种类型的变量.有三种主要的变量类型:环境变量.内部变量和用户变量. 环境变量(environment variable)是系统环境的一部分, ...
- Js的引用赋值与传值赋值
要说js的赋值方式时首先要说明js的数值类型:基本类型和引用类型. 1.基本类型 基本的数据类型有:undefined,boolean,number,string,null. 基本类型存放在栈区,访问 ...
随机推荐
- 【Netty】(5)源码 Bootstrap
[Netty]5 源码 Bootstrap 上一篇讲了AbstractBootstrap,为这篇做了个铺垫. 一.概述 Bootstrap 是 Netty 提供的一个便利的工厂类, 我们可以通过它来完 ...
- ES 09 - 定制Elasticsearch的分词器 (自定义分词策略)
目录 1 索引的分析 1.1 分析器的组成 1.2 倒排索引的核心原理-normalization 2 ES的默认分词器 3 修改分词器 4 定制分词器 4.1 向索引中添加自定义的分词器 4.2 测 ...
- 实现一个简单的基于Token的身份认证
这个例子是基于客户端与webapi进行进行交互的身份认证,当然也适用于其他情况下的身份认证. 简单的交互过程: 1.首先输入用户名.密码进行登录操作 2.服务器验证用户名.密码的正确性,验证通过之 ...
- [开源]Entity Framework 6 Repository 一种实现方式
在使用Entity Framework这种ORM框架得时候,一般结合Repository仓储形式来处理业务逻辑:虽然这种模式带来很多好处,但是也会引发一些争议,在此抛开不谈,小弟结合项目经验来实现一下 ...
- C++ Sqlite3的基本使用
|SQLite3简介 SQLite3只是一个轻型的嵌入式数据库引擎,占用资源非常低,处理速度比Mysql还快,专门用于移动设备上进行适量的数据存取,它只是一个文件,不需要服务器进程. SQL语句是S ...
- 2.1命令行和JSON的配置「深入浅出ASP.NET Core系列」
希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 命令行配置 1.新建控制台项目 2.nuget引入microsoft.aspnetcore.all 这里要注意版本 ...
- Spring Boot(六):如何优雅的使用 Mybatis
*:first-child{margin-top: 0 !important}.markdown-body>*:last-child{margin-bottom: 0 !important}.m ...
- Python编程从入门到实践笔记——用户输入和while循环
Python编程从入门到实践笔记——用户输入和while循环 #coding=utf-8 #函数input()让程序暂停运行,等待用户输入一些文本.得到用户的输入以后将其存储在一个变量中,方便后续使用 ...
- RequireJS入门级_RequireJS能给我们带来什么帮助?
前言:其实很早前就已经接触和了解到RequireJS了,当时只是大概明白它能用来控制JS的加载顺序,即:页面一定要先加载这个JS,再加载那个JS,对于RequireJS的好处还没有一个真正的体会和认识 ...
- .NET Framework VS .NET Core
本文对应的原文来至 c-sharpcorner 的一篇文章,文末有链接.如有错误,还请指正. 前言 你会为你的下一个应用程序选择哪一种开发平台 - .NET Framework 或者 .NET Cor ...