5.4  运算符

和其他的程序语言一样,PHP也有许多运算符。运算符可以用来处理数字、字符串及其他的比较运算和逻辑运算等。本节主要介绍常用的运算符,以及运算符的优先级。

5.4.1  常用的运算符

PHP有三种类型的运算符,它们是:

● 一元运算符,只运算一个值,例如:!(取反运算符)或++(加一运算符)。

● 二元运算符,PHP 支持的大多数运算符都是这种,例如:$a + $b。

● 三元运算符,即? :,它被用来根据一个表达式在另两个表达式中选择一个,而不是用来在两个语句或者程序路线中选择。

PHP中常用的运算符有算术运算符、赋值运算符、比较运算符、三元运算符、错误控制运算符、递增/递减运算符、逻辑运算符、字符串运算符、数组运算符等。下面我们分别介绍。

1.算术运算符

PHP的算术运算符如表5-2所示。

表5-2  算术运算符

例    子

名    称

结    果

-$a

取反

$a 的负值

$a + $b

加法

$a 和 $b 的和

$a - $b

减法

$a 和 $b 的差

$a * $b

乘法

$a 和 $b 的积

$a / $b

除法

$a 除以 $b 的商

$a % $b

取模

$a 除以 $b 的余数

注意,除号(/)总是返回浮点数,即使两个运算数是整数(或由字符串转换成的整数)也是这样。

2.赋值运算符

基本的赋值运算符是=,它意味着把右边表达式的值赋给左边的运算数。

赋值运算表达式的值也就是所赋的值。也就是说,$a = 3的值是 3。例如:

<?php

$a = ($b = 4) + 5;  // 变量$a的值是:9

?>

在基本赋值运算符之外,还有适合于所有二元算术和字符串运算符的“组和运算符”,这样可以在一个表达式中使用它的值并把表达式的结果赋给它,例如:

<?php

$a = 3;

$a += 5;   // 等价于:$a = $a + 5;

$b = "Hello ";

$b .= "world!"; //等价于: $b = $b . "world!";

?>

3.比较运算符

比较运算符,允许对两个值进行比较,PHP的比较运算符如表5-3所示。

表5-3  比较运算符

例  子

名  称

结    果

$a == $b

等于

True,如果 $a 等于 $b

$a === $b

全等

True,如果 $a 等于 $b,并且它们的类型也相同(PHP 4 引进)

$a != $b

不等

True,如果 $a 不等于 $b

$a <> $b

不等

True,如果 $a 不等于 $b

$a !== $b

非全等

True,如果 $a 不等于 $b,或者它们的类型不同(PHP 4 引进)

$a < $b

小于

True,如果 $a 严格小于 $b

$a > $b

大于

True,如果 $a 严格 $b

$a <= $b

小于等于

True,如果 $a 小于或者等于 $b

$a >= $b

大于等于

True,如果 $a 大于或者等于 $b

如果比较一个整数和字符串,则字符串会被转换为整数。如果比较两个数字字符串,则作为整数比较。多类型的比较规则如表5-4所示。

表5-4  多类型的比较规则

运算数1的类型

运算数2的类型

结    果

null或string

string

将NULL转换为"",进行数字或词汇比较

boolean或null

任何其他类型

转换为boolean,False < True

object

object

内置类可以定义自己的比较,不同类不能比较,相同类和数组比较其属性

string、resource string或number

resource或number

将字符串和资源转换成数字,按普通数字比较

array

array

具有较少成员的数组较小,如果运算数1中的键不存在于运算数2中则数组无法比较,否则逐个值比较

array

任何其他类型

array总是更大

object

任何其他类型

object总是更大

4.三元运算符

三元运算符是?:,语法如下:

(expr1) ? (expr2) : (expr3)

首先对expr1求值,若结果为True,则表达式(expr1) ? (expr2) : (expr3)的值为 expr2,否则其值为expr3。例如:

<?php

$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];

?>

首先判断$_POST['action']变量是否为空值,若是则给$action赋值为default,否则将$_POST['action']变量的值赋值给$action。这个三元运算符的功能和if...else语句很相似,我们可以将上面的代码改写成以下的代码:

<?php

if (empty($_POST['action'])) {

$action = 'default';

} else {

$action = $_POST['action'];

}

?>

5.错误控制运算符

PHP支持一个错误控制运算符@。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。

@运算符只对表达式有效。那么,何时使用此运算符呢?一个简单的规则就是,如果能从某处得到值,就能在它前面加上@运算符。例如,可以把它放在变量,函数和include()调用,常量等等之前。不能把它放在函数或类的定义之前,也不能用于条件结构例如if和foreach等。

对于如下的代码:

<?php

$Connid = mysql_connect ("localhost","username","pwd");

if ( $Connid )

echo "连接成功!";

else

echo "连接失败!";

?>

如果mysql_connect()执行失败,将显示系统的错误提示,而后继续执行下面的程序。如果不想显示系统的错误提示,并希望失败后立即结束程序,则可以改写上面的代码如下:

<?php

$Connid = @mysql_connect ("localhost","username","pwd") or die ("不能连接数据库服务器");

?>

在mysql_connect()函数前加上@运算符来屏蔽系统的错误提示,同时使用die()函数给出自定义的错误提示,然后立即退出程序。这种用法在大型程序中很常见。

6.递增/递减运算符

PHP支持C风格的前/后递增与递减运算符,如表5-5所示。

表5-5  递增/递减运算符

例    子

名    称

效    果

++$a

前加

$a的值加一,然后返回$a

$a++

后加

返回$a,然后将$a的值加一

--$a

前减

$a的值减一,然后返回$a

$a--

后减

返回$a,然后将$a的值减一

注意,递增/递减运算符不影响布尔值。递减NULL值也没有效果,但是递增NULL的结果是1。

7.逻辑运算符

PHP 的逻辑运算符,如表5-6所示。

表5-6  逻辑运算符

例    子

名    称

结    果

$a and $b

And(逻辑与)

True,如果$a与$b都为True

$a or $b

Or(逻辑或)

True,如果$a或$b任一为True

$a xor $b

Xor(逻辑异或)

True,如果$a或$b任一为True,但不同时是

! $a

Not(逻辑非)

True,如果$a不为True

$a && $b

And(逻辑与)

True,如果$a与$b都为True

$a || $b

Or(逻辑或)

True,如果$a或$b任一为True

“与”和“或”有两种不同形式运算符,它们运算的优先级不同,&&和||优先级高。

8.字符串运算符

有两个字符串运算符。第一个是连接运算符(.),它返回其左右参数连接后的字符串。第二个是连接赋值运算符(.=),它将右边参数附加到左边的参数后。例如:

<?php

$a = "Hello ";

$a = $a . "World!";  //此时 $a是 "Hello World!"

$b = "Hello ";

$b .= "World!";     //此时 $b 是 "Hello World!"

?>

9.数组运算符

PHP 的数组运算符,如表5-7所示。

表5-7  数组运算符

例    子

名    称

结    果

$a + $b

联合

$a和$b的联合

$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

+运算符把右边的数组附加到左边的数组后面,但是重复的键值不会被覆盖。下面通过一个实例来看一下如何用+运算符联合两个数组:

代码清单5-6  用+运算符联合两个数组(ex5_06.php)

<?php

$a = array("a" => "apple", "b" => "banana");

$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");

$c = $a + $b;

echo "数组 /$a 和 /$b 联合之后 : <br>";

var_dump($c);

?>

在浏览器中浏览此文件,结果如图5-6所示。

图5-6  浏览ex5_06.php

可以看到,在联合之后的数组中,键“a”的值是“apple”,而不是“pear”,同样,键“b”的值是“banana”,而不是“strawberry”,但是键“c”的值是“cherry”。

在上面的代码中,使用了var_dump()函数,此函数用于显示一个或多个表达式的结构信息,包括表达式的类型与值。对于数组将递归地展开值。

5.4.2  运算符的优先级

运算符优先级指定了两个表达式绑定得有多“紧密”。例如,表达式1 + 5 * 3的结果是16而不是18是因为乘号(*)的优先级比加号(+)高。必要时可以用括号来强制改变优先级。例如(1 + 5) * 3的值为18。使用括号也可以增强代码的可读性。如果运算符优先级相同,则使用从左到右的左结合顺序(左结合表示表达式从左向右求值,右结合相反)。

表5-8从高到低列出了PHP所有运算符的优先级。同一行中的运算符具有相同优先级,此时它们的结合方向决定求值顺序。

表5-8  运算符优先级

结合方向

运  算  符

附加信息

非结合

new

new

[

array()

非结合

++ --

递增/递减运算符

(续)

结合方向

运  算  符

附加信息

非结合

! ~ - (int) (float) (string) (array) (object) @

类型

* / %

算数运算符

+ - .

算数运算符和字符串运算符

<< >>

位运算符

非结合

< <= > >=

比较运算符

非结合

== != === !==

比较运算符

&

位运算符和引用

^

位运算符

|

位运算符

&&

逻辑运算符

||

逻辑运算符

? :

三元运算符

= += -= *= /= .= %= &= |= ^= <<= >>=

赋值运算符

and

逻辑运算符

xor

逻辑运算符

or

逻辑运算符

,

多处用到

PHP Comparision Operater相关推荐

  1. python使用matplotlib可视化不同年份、不同项目的均值(mean)对比条形图(bar plot comparision of mean with different years)

    python使用matplotlib可视化不同年份.不同项目的均值(mean)对比条形图(bar plot comparision of mean with different years) 目录

  2. C++尽量在operater=中处理“自我赋值”

    operater=中处理"自我赋值 下面的operator=实现是一份不安全的实现,在自赋值时会出现问题: 1.在开头添加"证同测试" c++ 2.通过确保异常安全来获得 ...

  3. k8s operater简介

    在谈operater之前,我觉得有必要先回顾下k8s资源.k8s中将所有的资源抽象为内存,资源实例化之后称之为对象.资源大体上分为两大块: 1.内资资源类型: 工作负载型资源:Pod.Deployme ...

  4. 编写自己的kubernetes operater

    在k8s中有许多编排工具,目前比较热门的是包管理工具Helm,如果说docker是奠定的单实例的标准化交付,那么Helm则是集群化多实例.多资源的标准化交付,但是helm 只能实现简单的编排能力,一些 ...

  5. c++ 中operater delete和operater new重载

    如果一个类中重载了operater delete (void* pMem)和 operater new(size_t nSize) 函数 如: static void* operator new(si ...

  6. JavaSE-02 Operater运算符

    JavaSE 二.Operater运算符 Demo1:二元运算 int a = 11;int b = 21;System.out.println(a+b);System.out.println(a-b ...

  7. 基本函数input() print() map() filter() reduce()和lambda()算子-operater用法

    #输入逗号分割的两个数字--input输入的内容,默认为字符类型 x,y =input("input:").split(",") print(x,y)#输入的多 ...

  8. Overall Comparision With WCDMA

  9. flink查看operater链的中间结果+SingleOutputStreamOperator的用法

    flink的算子写法常常是 data.func1.func2.func3...... 这种写法就不太好查看中间的结果到底是啥,不太好调试. 下面换一种写法: data func1Operator=.. ...

最新文章

  1. 关于socket的一些探究
  2. 网络编程学习笔记(freeaddrinfo函数)
  3. USB基础---OHCI、UHCI、EHCI和XHCI控制器简介
  4. 数据结构之希尔排序图文详解及代码(C++实现)
  5. AI显微镜面市:20分钟诊断疟疾,精度满足世卫最高标准
  6. Arcpy 实现NDVI最大值合成/平均值合成
  7. 一文读懂PCB品质体系认证
  8. CC2500的CCA
  9. justinmind夜话:数据母板系列视频教程之原型设计二十一条军规
  10. 【雕爷学编程】Arduino动手做(76)---2路光耦继电器模块
  11. Leet Code OJ 刷题顺序参考
  12. GTD时间管理阅读笔记
  13. Electron使用sqlite3 出现install aws-sdk和_handle的解决方案!
  14. java设计模式 之适配器模式
  15. Android数字华容道代码,Android源码 之《最强大脑》“数字华容道”
  16. python一只青蛙一次可以_python算法题 python123网站单元四题目
  17. reactos操作系统实现(47)
  18. win10邮件配置qq邮箱和outlook邮箱
  19. 设置Firefox(火狐)浏览器的中文菜单/界面
  20. linux设备驱动之PCI总线概述

热门文章

  1. Nomalized Compression Distance(NCD)详解
  2. 小程序开发有哪些盈利模式?
  3. 沉痛悼念倪海廈老師!
  4. STM32F4驱动42步进电机(采用驱动器)
  5. 艺术名人对冰雪画家冯庆的评语
  6. qrcode.js使用js生成二维码(并下载)的实践
  7. Standford 机器学习应用的建议及机器学习系统的设计
  8. java操作win10防火墙
  9. RHEL6系统上配置磁盘阵列(RAID)
  10. 怎样解决KeyShot中的黑屏问题