首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

10-2  赋值和比较

使用以下某个赋值操作符时就会发生变量赋值:=、+=、-=、*=、/=、%=、.=、&=、|=、^=、<<=或>>=。其中最简单的形式(=)可以创建一个任意类型的新变量,或赋一个新值。赋值操作符左边是变量,右边是值或表达式。其他赋值操作符要复杂一些,它们都假设到达这条赋值语句之前左边的变量已经被定义。结果将是左边变量的当前值与右边的值完成操作(由操作符标识)得到的结果。$a += $b; 等同于$a = $a + $b;。

赋值时(使用=操作符的简单赋值),如果变量已经定义(已经有值),创建新值之前会丢掉原值。所有其他赋值操作符则会重用原值来创建一个新值。如果需要,原值在计算和赋值之前会转换为适当的类型。例如,如果$a是一个整数,使用字符串连接操作符时,则有$a .= "string value";。

PHP对所有变量都使用一种引用计数系统,所以不使用变量时无需释放变量。所有已分配的内存都会在停止请求时释放,不过对于使用了大量内存的脚本或长时间运行的进程,如CLI或PHP-GTK脚本而言,可能需要释放不用的变量以便其他变量使用该内存。通过把变量赋值为NULL($a = NULL;)或者使用unset()函数可以从内存中释放任何变量。

说明     如果多个变量名引用了相同的变量,它们都会在内存释放前撤销。这个技巧将讨论对内存中的相同数据创建多个引用。

可以用两种方式为数组增加值。如果左边是一个变量,右边可以是一个数组定义,例如:$a = array(9, 7, "orange", "apple");。这会创建一个包含4个元素的数组,以数字顺序自动设置索引或键值(从0开始)。也可以用一个表达式来增加新值或者替换原值,在此赋值操作符的左边指向数组中的某个值。所以设置$a[2] = "pear"; 将把第三个元素orange替换为pear,因为键值2已经在使用。如果键尚不存在,将向数组增加一个新元素。设置$a[5] = "orange"; 就会增加键值为5的一个新元素orange,数组现在就有了5个元素。注意,此时并没有键值为4的元素。如果想访问或使用$a[4],可能会得到一个变量未定义警告。可以使用一种特殊记法让PHP自动赋键值。为此,只需在赋值中忽略键,如$a[] = "apricot"。这样就会创建键6,并赋值为apricot。这种记法总是使用数值索引,而且下一个值将比数组中最大的数值索引值大1。

还可以指定键值来强制键与值之间的特定关系,如下例所示,这里键和值都混合有数值和字符串值。

代码

工作原理

在这个例子中,创建了一个包含6个值的数组,用=>操作符对键赋值。前4个值赋给数值键,后两个值赋给字符串键。代码的输出如下:

使用unset()函数可以去除数组中的一个值。这会把该值从数组中删除,但不会重排任何键值。前例中的代码unset($a[3]); 将从数组中删除apple。PHP实现了很多操纵数组的函数,其中一个函数需要特别注意,这就是list()函数(或list()语言构造)。类似于array(),实际上list()不是一个函数,而只是告诉引擎如何处理特殊数据的一种方法。它用在赋值操作符的左边,当右边是一个数组或结果是数组的一个表达式时,它会同时为多个变量赋值。

说明    list()只对数值数组起作用,而且假设数值索引从0开始。

下面的例子展示了如何使用list()函数。

代码

工作原理

首先,定义一个包含3个元素的数组。这可以是一个函数调用的返回值。其次,从数组中抽取出这些值,并用一个list()函数调用并保存在单独的变量中。最后,打印这3个新变量得到输出:

为变量赋值时,实际上会得到该值的一个副本。通过使用特殊的&操作符,可以创建一个新变量,这个新变量与原变量在内存中引用的值相同。最好用一个小例子来说明这一点,这里定义了两个值。在代码的第一部分,$b赋为$a的一个副本,在第二部分中,$b赋为$a的一个引用。

代码

工作原理

在第一部分中,$a和$b有独立的值,所以改变一个变量不会影响另外一个。在第二部分中,两个变量共享相同的内存,所以改变一个变量的值会影响另一个变量的值。

当两个或更多变量共享相同的内存时,可以对其中一个变量使用unset()函数,但不影响其他变量。unset()函数只是删除引用,而不是删除值。

PHP有两种比较操作符。即使两个值有不同的数据类型,松比较操作符(loose comparison)也会完成比较,严格比较操作符(strict comparison)则会对值和数据类型都进行比较。所以,如果两个变量的类型不同,即使二者的值确实相等,用严格操作符比较时它们总是不同的。表10-3和10-4列出了这两类比较操作符。

表10-3  松比较操作符

示    例

名    称

描    述

$a == $b

等于

如果$a等于$b则为True

$a != $b

不等于

如果$a不等于$b则为True

$a<$b

小于

如果$a小于$b则为True

$a>$b

大于

如果$a大于$b则为True

$a <= $b

小于等于

如果$a小于等于$b则为True

$a >= $b

大于等于

如果$a大于等于$b则为True

表10-4  严格比较操作符

示    例

名    称

描    述

$a === $b

等于

如果$a等于$b,而且二者类型相同,则为True

$a !== $b

不等于

如果$a不等于$b,而且二者类型相同,则为True

使用松操作符时,如果数据类型不同,PHP会在完成比较之前把其中一个变量转换为与另一个变量有相同的类型。为了说明这些操作符是如何工作的,下面的例子建立了一个脚本,循环处理一个由不同数据类型组成的数组,并将所有元素的值相互进行比较。

代码

工作原理

这个脚本定义了一个数组,其中的值有不同的类型,另外定义了一个函数对输出进行格式化,还有一个函数利用结果创建了HTML表。这里需要用格式化函数dump_value()为布尔值和浮点数值打印更易读的值。每个比较类型都会调用一次CreateTable()函数。从浏览器中查看时,这个脚本的输出如图10-1和图10-2所示。

图10-1  用松操作符比较不同类型的变量

图10-2  用严格操作符比较不同类型的变量

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论