PHP中=赋值操作符对不同数据类型的不同行为
作者:bea
首先解释赋值操作符=的行为,看下面的例子: 代码如下: $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); /
首先解释赋值操作符=的行为,看下面的例子:
代码如下:
$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的值。
有用 | 无用
代码如下:
$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的日期处理函数及uchome的function_coomon中日期处理函数的研究
- PHP日期处理函数 整型日期格式
- Base64在线编码解码实现代码 演示与下载
- php !function_exists("T7FC56270E7A70FA81A5935B72EACBE29"))代码解密
- PHP备份/还原MySQL数据库的代码
- php循环检测目录是否存在并创建(循环创建目录)
- 全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
- Discuz Uchome ajaxpost小技巧
- php INI配置文件的解析实现分析
- PHP strncasecmp字符串比较的小技巧
- php simplexmlElement操作xml的命名空间实现代码
- array_multisort实现PHP多维数组排序示例讲解
- PHP 设置MySQL连接字符集的方法
- php array_unique之后json_encode需要注意
- 从php核心代码分析require和include的区别
- 深入理解PHP之require/include顺序 推荐
- PHP中foreach循环中使用引用要注意的地方
- PHP开发中四种查询返回结果分析
- linux下删除7天前日志的代码(php+shell)