PHP中=赋值操作符对不同数据类型的不同行为

 更新时间:2011年01月02日 00:38:49   作者:  
作为一个PHP的新手,一直对PHP的引用困惑了很久,今晚仔细看了用户手册和做了一些实验,终于明白了其中的原理和细节,特别是=操作符对于不同类型的不同行为。
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

首先解释赋值操作符=的行为,看下面的例子:

复制代码 代码如下:

$i = 0;
$j = $i;
$j = 0;
echo $j; // 打印输出0

$arr = array(0);
$arr2 = $arr;
$arr2[0] = 1;
echo $arr[0]; //打印输出0

class B
{
public $i = 0;
}

$b = new B();
$c = $b;
$c->i = 1;
echo($b->i); // 打印输出1

从这个例子可以看出,如果=操作符右边的变量为基本数据类型或者数组,那么=操作符把右边变量的一份拷贝赋值给左边变量;如果右边变量不是基本数据类型或者数组,如class,那么=会把一个指向右边变量的引用赋值给左边变量。注意:是指向右边变量的引用,而不是指向右边变量所指的内容区域的引用;具体看下边的例子
复制代码 代码如下:

$a = new A();
$b_a = $a;
$b_r = &$a;

$b_a = null;
var_dump($a); //打印 object(A)[2],$a所指向的内容还在
$b_r = null;
var_dump($a); // 打印 null,$a所指向的内容被清除了

上面的例子也说明了,如果用 $var = &$a 的方式赋值的话,用$var=null来销毁变量$var的话事实上是把$var所指内容被设置null了,其实这句话也暗示了任何一个指向该内容区域的引用变量均可用来销毁该内容区域的内容。所以,要销毁变量$var的话用 unset($var) 。PS:事实上一这种方式赋值$var只是个引用,占用不了多少内存,要不要销毁没所谓,这里这是说下必须用unset的方式销毁。

下面则是《用户手册》中的“引用的解释”的例子:

$a =& $b;
下边有这么一句解释:
这意味着 $a 和 $b 指向了同一个变量。
注: $a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方。
引用是什么?
复制代码 代码如下:

在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身――变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的紧密连接。

关于“引用是什么”的一点解释:

int i = 0;
int j = 0;
int *p = &i;
p = &j;
上面的代码中,p是一个指向i的内存地址的指针,而*p才是其中的内容;p=&j指向改变了p指针的指向,用*p=111的表达式才会改变i的内容。而PHP中则不是,下面的例子

$i = 0;
$p = &$i;
$p = 111则马上会改变$i的值。

相关文章

  • php输出xml格式字符串(用的这个)

    php输出xml格式字符串(用的这个)

    php输出xml格式字符串代码,需要的朋友可以参考下
    2012-07-07
  • PHP 实现多服务器共享 SESSION 数据

    PHP 实现多服务器共享 SESSION 数据

    稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名、密码在整个网站的各个模块中都是可以登录使用的。
    2009-08-08
  • PHP 编程的 5个良好习惯

    PHP 编程的 5个良好习惯

    像其他语言一样,开发人员可以用 PHP 编写出各种质量级别的代码。学习良好的编程习惯能够提高代码质量和效率。
    2009-02-02
  • php之性能优化案例

    php之性能优化案例

    这篇文章主要介绍了php之性能优化案例,本文通过多个案例和多种场景下讲述了如何对php脚本进行性能上的优化,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 浅析php与数据库代码开发规范

    浅析php与数据库代码开发规范

    以下是对php与数据库代码开发规范进行了简单的分析介绍。需要的朋友可以过来参考下
    2013-08-08
  • linux下为php添加curl扩展的方法

    linux下为php添加curl扩展的方法

    一般php源码的扩展库里已经带了curl的扩展,所以没有必要下载,直接将编译扩展即可
    2011-07-07
  • php实现往pdf中加数字签名操作示例【附源码下载】

    php实现往pdf中加数字签名操作示例【附源码下载】

    这篇文章主要介绍了php实现往pdf中加数字签名操作,结合完整实例形式详细分析了php基于tcpdf插件实现数字签名操作的具体步骤与相关技巧,并附带crt加密文件、源码等供读者下载,需要的朋友可以参考下
    2018-08-08
  • PHP根据两点间的经纬度计算距离

    PHP根据两点间的经纬度计算距离

    这篇文章主要介绍了PHP如何根据两点间的经纬度计算距离,代码很简单,但很实用,需要的朋友可以参考下
    2014-10-10
  • 用来给图片加水印的PHP类

    用来给图片加水印的PHP类

    不错的一个php添加水印的类
    2008-04-04
  • PHP数组函数array_multisort()用法实例分析

    PHP数组函数array_multisort()用法实例分析

    这篇文章主要介绍了PHP数组函数array_multisort()用法,结合实例形式详细分析了array_multisort函数的功能,定义及进行数组排序过程中的使用技巧,需要的朋友可以参考下
    2016-04-04

最新评论

?


http://www.vxiaotou.com