《简明 PHP 教程》05 运算符与表达式

运算符是可以通过给出的一或多个值(用编程行话来说,表达式)来产生另一个值(因而整个结构成为一个表达式)的东西。

运算符可按照其能接受几个值来分组。一元运算符只能接受一个值,例如 !(逻辑取反运算符)或 ++(递增运算符)。 二元运算符可接受两个值,例如熟悉的算术运算符 +(加)和 -(减),大多数 PHP 运算符都是这种。最后是唯一的三元运算符 ? :,可接受三个值;通常就简单称之为“三元运算符”(尽管称之为条件运算符可能更合适)。

表达式是 PHP 最重要的基石。在 PHP 中,几乎所写的任何东西都是一个表达式。简单但却最精确的定义一个表达式的方式就是“任何有值的东西”。

运算符

接下来我们将简要了解各类运算符及它们的用法。

要记得你可以随时在解释器中对给出的案例里的表达式进行求值。例如要想测试表达式 2+3,则可以使用交互式 PHP 解释器提示符:

php > echo 2 + 3;
5
php > echo 3 * 5;
15
php > 

下面是可用运算符的速览:

  • -$a(取反), $a 的负值,-3.14 将输出一个负数。
  • $a + $b(加法), a 和b 的和,3 + 5 输出 8
  • $a - $b(减法), a 和b 的差,50 - 24 输出 26
  • $a * $b(乘法), a 和b 的积,2 * 3 输出 6
  • $a / $b(除法), a 除以b 的商,13 / 3 输出 4.3333333333333
  • $a % $b(取模), a 除以b 的余数,13 % 3 输出 1-25.5 % 2.25 输出 -1
  • $a ** $b(乘方), a 的b 次方,3 ** 4 输出 81
  • =(赋值),把右边表达式的值赋给左边的表达式,$a = 3 的值是 3。PHP 支持引用赋值,$var = &$othervar;,意味着两个变量指向了同一个数据。
  • $a & $b(按位与),将把 a 和b 中都为 1 的位设为 1。
  • $a | $b(按位或),将把 a 和b 中任何一个为 1 的位设为 1。
  • $a ^ $b(按位异或),将把 a 和b 中一个为 1 另一个为 0 的位设为 1。
  • ~ $a(按位取反),将 $a 中为 0 的位设为 1,反之亦然。
  • $a << $b(左移),将 a 中的位向左移动b 次(每一次移动都表示“乘以 2”)。
  • $a >> $b(右移),将 a 中的位向右移动b 次(每一次移动都表示“乘以 2”)。
  • $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,如果 a 严格小于b。
  • $a > $b(大于),TRUE,如果 a 严格大于b。
  • $a <= $b(小于等于),TRUE,如果 a 小于或者等于b。
  • $a >= $b(大于等于),TRUE,如果 a 大于或者等于b。
  • $a <=> $b(太空船/组合比较),当 a 小于、等于、大于b 时 分别返回一个小于、等于、大于 0 的 integer 值。 PHP7 开始提供。
  • $a ?? $b ?? $c(NULL 合并操作符),从左往右第一个存在且不为 NULL 的操作数。如果都没有定义且不为 NULL,则返回 NULL。PHP7 开始提供。
  • @(错误控制),当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。
  • ``(执行),PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回。
  • ++$a(前加),a 的值加一,然后返回a。
  • $a++(后加),返回 a,然后将a 的值加一。
  • --$a(前减),a 的值减一,然后返回a。
  • $a--(后减),返回 a,然后将a 的值减一。
  • $a and $b(逻辑与),TRUE,如果 a 和b 都为 TRUE。
  • $a or $b(逻辑或),TRUE,如果 a 或b 任一为 TRUE。
  • $a xor $b(逻辑异或),TRUE,如果 a 或b 任一为 TRUE,但不同时是。
  • ! $a(逻辑非),TRUE,如果 $a 不为 TRUE。
  • $a && $b(逻辑与),TRUE,如果 a 和b 都为 TRUE。
  • $a || $b(逻辑或),TRUE,如果 a 或b 任一为 TRUE。
  • .(连接),返回其左右参数连接后的字符串。
  • .=(连接赋值),将右边参数附加到左边的参数之后。
  • $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。
  • instanceof(类型),用于确定一个 PHP 变量是否属于某一类 class 的实例。

除法运算符总是返回浮点数。只有在下列情况例外:两个操作数都是整数(或字符串转换成的整数)并且正好能整除,这时它返回一个整数。

取模运算符的操作数在运算之前都会转换成整数(除去小数部分)。

数值运算与赋值的快捷方式

一种比较常见的操作是对一个变量进行一项数学运算并将运算得出的结果返回给这个变量,因此对于这类运算通常有如下的快捷表达方式:

<?php
$a = 2;
$a = $a * 3;

同样也可写作:

<?php
$a = 2;
$a *= 3;

要注意到 变量 = 变量 运算 表达式 会演变成 变量 运算 = 表达式

上述赋值运算将原变量的值拷贝到新变量中(传值赋值),所以改变其中一个并不影响另一个。

PHP 也支持引用赋值,使用“var = &othervar;”语法。引用赋值意味着两个变量指向了同一个数据,没有拷贝任何东西。

求值顺序

如果你有一个诸如 2 + 3 * 4 的表达式,是优先完成加法还是优先完成乘法呢?我们的高中数学知识会告诉我们应该先完成乘法。这意味着乘法运算符的优先级要高于加法运算符。

下面将给出 PHP 中从最低优先级(最少绑定)到最高优先级(最多绑定)的优先级表。这意味着,在给定的表达式中,PHP 将优先计算表中位列于后的较高优先级的运算符与表达式。

为了保持完整,下表是从 PHP 参考手册 中引用而来。你最好使用圆括号操作符来对运算符与操作数进行分组,以更加明确地指定优先级。这也能使得程序更加可读。你可以阅读改变运算顺序来了解更多的细节。

改变运算顺序 {#changing-order-of-evaluation}

为了使表达式更加易读,我们可以使用括号。举个例子,2 + (3 * 4) 自是要比 2 + 3 * 4 要更加容易理解,因为后者还要求你了解运算符的优先级。使用括号要适度,同时不要像 (2 + (3 * 4)) 这样冗余。

使用括号还有一个额外的优点——它能帮助我们改变运算的顺序。同样举个例子,如果你希望在表达式中计算乘法之前应先计算加法,那么你可以将表达式写作 (2 + 3) * 4

结合性

运算符通常由左至右结合。这意味着具有相同优先级的运算符将从左至右的方式依次进行求值。如 2 + 3 + 4 将会以 (2 + 3) + 4 的形式加以计算。

表达式

案例(将其保存为 expression.php

<?php
$length = 5;
$breadth = 2;

$area = $length * $breadth;

echo 'Area is ' . $area . "\n";
echo 'Perimeter is ' . 2 * ($length + $breadth) . "\n";

输出:

$ php expression.php
Area is 10
Perimeter is 14

它是如何工作的

矩形的长度(Length)与宽度(Breadth)存储在以各自名称命名的变量中。我们使用它们并借助表达式来计算矩形的面积(Area)与周长(Perimeter)。我们将表达式 $length * $breadth 的结果存储在变量 $area 中并将其通过使用 echo 函数打印出来。在第二种情况中,我们直接在 echo 函数中使用了表达式 2 * ($length + $breadth) 的值。

总结

我们已经了解了如何使用运算符、操作数与表达式——这些是我们构建任何程序的基本块。接下来,我们将看到如何在程序中善加利用这些语句。

关注公众号「展白说」,获取更多有价值的内容。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容

  • 运算符是处理数据的基本方法,用来从现有的值得到新的值。JavaScript 提供了多种运算符,本章逐一介绍这些运算...
    徵羽kid阅读 671评论 0 0
  • 表达式和运算符 程序中最简单的表达式就是,程序中的常量 变量名也是一种简单的表达式 复杂的表达式是由简单的表达式组...
    zhaolion阅读 1,630评论 3 12
  • PHP 的运算符,它包含算术运算符、赋值运算符、位运算符、比较运算符、执行运算符、递增递减运算符、逻辑运算符、字符...
    三生石的等待阅读 360评论 0 0
  • 接着之前的知识点,继续学习js.还是一如既往的在简书上求个赞~ 表达式呢,它是JavaScript的一个短语,js...
    我就是z阅读 642评论 3 2
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,735评论 0 10