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

2015-01-24信息快讯网

作为一个PHP的新手,一直对PHP的引用困惑了很久,今晚仔细看了用户手册和做了一些实验,终于明白了其中的原理和细节,特别是=操作符对于不同类型的不同行为。

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

 
$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 的文件名和文件本身DD变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 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 第一节 php简介
PHP原生模板引擎 最简单的模板引擎
php实现rc4加密算法代码
PHP filter_var() 函数 Filter 函数
iis下php mail函数的sendmail配置方法(官方推荐)
php判断变量类型常用方法
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
php 操作符与控制结构
第三章 php操作符与控制结构代码
PHP读取txt文件的内容并赋值给数组的代码
php学习笔记(三)操作符与控制结构
PHP5 的对象赋值机制介绍
利用PHP实现智能文件类型检测的实现代码
PHP文件上传后缀名与文件类型对照表整理
PHP的范围解析操作符(::)的含义分析说明
php header Content-Type类型小结
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
php的list()的一步操作给一组变量进行赋值的使用
php cookies中删除的一般赋值方法
vs中通过剪切板循环来循环粘贴不同内容
linux下删除7天前日志的代码(php+shell)
完美实现GIF动画缩略图的php代码
php实现无限级分类实现代码(递归方法)
php下尝试使用GraphicsMagick的缩略图功能
PHP读取XML值的代码(推荐)
PHP中simplexml_load_string函数使用说明
php 传值赋值与引用赋值的区别
php目录操作函数之获取目录与文件的类型
php数据入库前清理 注意php intval与mysql的int取值范围不同
php foreach 参数强制类型转换的问题
php通过文件头检测文件类型通用代码类(zip,rar等)
PHP中的integer类型使用分析
PHP中的float类型使用说明
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
php foreach 使用&(与运算符)引用赋值要注意的问题
php smarty模版引擎中变量操作符及使用方法
php 向访客和爬虫显示不同的内容
php 不同编码下的字符串长度区分
©2014-2024 dbsqp.com