From d38cfbbdce1b563df47afaa72b1b2a5a132141e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AD=94=E7=8E=8B=E5=8D=B7=E5=AD=90?= Date: Tue, 17 Oct 2023 21:30:47 +0800 Subject: [PATCH] Update language --- language/operators.xml | 2702 +-------------------------- language/operators/arithmetic.xml | 100 + language/operators/array.xml | 137 ++ language/operators/assignment.xml | 235 +++ language/operators/bitwise.xml | 640 +++++++ language/operators/comparison.xml | 505 +++++ language/operators/errorcontrol.xml | 68 + language/operators/execution.xml | 42 + language/operators/increment.xml | 139 ++ language/operators/logical.xml | 105 ++ language/operators/precedence.xml | 391 ++++ language/operators/string.xml | 35 + language/operators/type.xml | 260 +++ 13 files changed, 2692 insertions(+), 2667 deletions(-) create mode 100644 language/operators/arithmetic.xml create mode 100644 language/operators/array.xml create mode 100644 language/operators/assignment.xml create mode 100644 language/operators/bitwise.xml create mode 100644 language/operators/comparison.xml create mode 100644 language/operators/errorcontrol.xml create mode 100644 language/operators/execution.xml create mode 100644 language/operators/increment.xml create mode 100644 language/operators/logical.xml create mode 100644 language/operators/precedence.xml create mode 100644 language/operators/string.xml create mode 100644 language/operators/type.xml diff --git a/language/operators.xml b/language/operators.xml index 356d05d955..9a2ee2ca2c 100755 --- a/language/operators.xml +++ b/language/operators.xml @@ -1,2673 +1,41 @@ - + - - 运算符 - - 运算符是可以通过给出的一或多个值(用编程行话来说,表达式)来产生另一个值(因而整个结构成为一个表达式)的东西。 - - - 运算符可按照其能接受几个值来分组。一元运算符只能接受一个值,例如 - !逻辑取反运算符)或 - ++递增运算符)。 - 二元运算符可接受两个值,例如熟悉的算术运算符 - +(加)和 -(减),大多数 PHP - 运算符都是这种。最后是唯一的三元运算符 ? :,可接受三个值;通常就简单称之为“三元运算符”(尽管称之为条件运算符可能更合适)。 - - - PHP 的运算符完整列表见下节运算符优先级。该节也解释了运算符优先级和结合方向,这控制着在表达式包含有若干个不同运算符时究竟怎样对其求值。 - - - - 运算符优先级 - - 运算符优先级指定了两个表达式绑定得有多“紧密”。例如,表达式 1 + 5 * - 3 的结果是 16 而不是 18 - 是因为乘号(“*”)的优先级比加号(“+”)高。必要时可以用括号来强制改变优先级。例如:(1 - + 5) * 3 的值为 18。 - - - 如果运算符优先级相同,那运算符的结合方向决定了该如何运算。例如,"-"是左联的,那么 1 - 2 - 3 就等同于 (1 - 2) - 3 - 并且结果是 -4. 另外一方面,"="是右联的,所以 $a = $b = $c 等同于 - $a = ($b = $c)。 - - - 没有结合的相同优先级的运算符不能连在一起使用,例如 - 1 < 2 > 1 在PHP是不合法的。但另外一方面表达式 - 1 <= 1 == 1 是合法的, 因为 == 的优先级低于 - <=。 - - - 关联性仅对二(三)元操作符有意义。 - 一元操作符是前缀或者后缀,所以不适用该概念。 - 例如 !!$a 仅可分为 !(!$a)。 - - - 括号的使用,哪怕在不是必要的场合下,通过括号的配对来明确标明运算顺序,而非靠运算符优先级和结合性来决定,通常能够增加代码的可读性。 - - - 下表按照优先级从高到低列出了运算符。同一行中的运算符具有相同优先级,此时它们的结合方向决定求值顺序。 - - 运算符优先级 - - - - 结合方向 - 运算符 - 附加信息 - - - - - 不适用 - - clone - new - - clone 和 new - - - - ** - 算术运算符 - - - 不适用 - - + - - - ++ - -- - ~ - (int) - (float) - (string) - (array) - (object) - (bool) - @ - - - 算术 (一元 +-), - 递增/递减, - 按位, - 类型转换&listendand; - 错误控制 - - - - - instanceof - - 类型 - - - - 不适用 - ! - - 逻辑运算符 - - - - - - * - / - % - - - 算术运算符 - - - - - - + - - - . - - - 算数 (二元 +-), - array&listendand; - string (. PHP 8.0.0 前可用) - - - - - - << - >> - - - 位运算符 - - - - - . - - string (PHP 8.0.0 起可用) - - - - - - < - <= - > - >= - - - 比较运算符 - - - - - - == - != - === - !== - <> - <=> - - - 比较运算符 - - - - - & - - 位运算符&listendand;引用 - - - - ^ - - 位运算符 - - - - - | - - 位运算符 - - - - - && - - 逻辑运算符 - - - - - || - - 逻辑运算符 - - - - - ?? - - null 合并运算符 - - - - 无关联 - ? : - - 三元运算符 - (PHP 8.0.0 之前左联) - - - - - - = - += - -= - *= - **= - /= - .= - %= - &= - |= - ^= - <<= - >>= - ??= - - - 赋值运算符 - - - - 不适用 - yield from - - yield from - - - - 不适用 - yield - - yield - - - - 不适用 - print - print - - - - and - - 逻辑运算符 - - - - - xor - - 逻辑运算符 - - - - - or - - 逻辑运算符 - - - - -
-
- - - 结合方向 - - $a = 5, $b = 5 -?> -]]> - - - - - 运算符优先级和关联方式仅决定表达式如何分组,不指定计算顺序。 - 一般情况下, PHP 不指定表达式的计算顺序,并且代码避免指定假设执行顺序, - 因为行为会在 PHP 版本间发生变化或者依赖于旁边的代码。 - - 未定义执行顺序 - - -]]> - - - - <literal>+</literal>、<literal>-</literal> 、<literal>.</literal> 具有相同的优先级 - - -]]> - - &example.outputs; - - - - - - - - 尽管 = 比其它大多数的运算符的优先级低,PHP - 仍旧允许类似如下的表达式:if (!$a = foo()),在此例中 - foo() 的返回值被赋给了 $a。 - - - - &reftitle.changelog; - - - - - &Version; - &Description; - - - - - 8.0.0 - - 现在,字符串连接符(.)的优先级比算数加/减(+ 和 - -)、按位左/右移(<< 和 - >>)更低。在此之前,它的优先级与 +、 - - 相同,并且比 <<、 - >> 更高。 - - - - 8.0.0 - - 三元运算符(? :)是现在是非关联的;以前它是左联的。 - - - - 7.4.0 - - 已弃用在无括号的表达式中依赖字符串连接(.)相对于算数加/减(+ 或者 - -)或者按位左/右移(<< 或者 - >>)的优先级的使用方法。 - - - - 7.4.0 - - 不推荐使用三元运算符(? :)的左联。 - 即已弃用嵌套多个未带括号的三元运算符。 - - - - - - -
- - - 算术运算符 - - 还记得学校里学到的基本数学知识吗?就和它们一样。 - - - 算术运算符 - - - - 例子 - 名称 - 结果 - - - - - +$a - 标识 - - 根据情况将 $a 转化为 int 或 - float。 - - - - -$a - 取反 - $a 的负值。 - - - $a + $b - 加法 - $a$b 的和。 - - - $a - $b - 减法 - $a$b 的差。 - - - $a * $b - 乘法 - $a$b 的积。 - - - $a / $b - 除法 - $a 除以 $b 的商。 - - - $a % $b - 取模 - $a 除以 $b 的余数。 - - - $a ** $b - 求幂 - $a$b次方的值。 - - - -
- - 除法运算符总是返回浮点数。只有在下列情况例外:两个操作数都是整数(或字符串转换成的整数)并且正好能整除,这时它返回一个整数。 - 整数除法可参考 intdiv。 - - - 取模运算符的操作数在运算之前都会转换成 int 。 浮点数取模可参考 - fmod。 - - - 取模运算符 % 的结果和被除数的符号(正负号)相同。即 - $a % $b 的结果和 $a 的符号相同。例如: - - - -]]> - - - - - &reftitle.seealso; - - - 数学函数 - - - - -
- - - 赋值运算符 - - 基本的赋值运算符是“=”。一开始可能会以为它是“等于”,其实不是的。它实际上意味着把右边表达式的值赋给左边的运算数。 - - - 赋值运算表达式的值也就是所赋的值。也就是说,“$a = 3”的值是 3。这样就可以做一些小技巧: - - - -]]> - - - - - - 在基本赋值运算符之外,还有适合于所有二元算术,数组集合和字符串运算符的“组合运算符”,这样可以在一个表达式中使用它的值并把表达式的结果赋给它,例如: - - - -]]> - - - - - 注意赋值运算将原变量的值拷贝到新变量中(传值赋值),所以改变其中一个并不影响另一个。这也适合于在密集循环中拷贝一些值例如大数组。 - - - 在 PHP 中普通的传值赋值行为有个例外就是碰到对象 object 时,在 - PHP 5 中是以引用赋值的,除非明确使用了 clone 关键字来拷贝。 - - - - 引用赋值 - - PHP 支持引用赋值,使用“$var - = &$othervar;”语法。引用赋值意味着两个变量指向了同一个数据,没有拷贝任何东西。 - - - - 引用赋值 - - -]]> - - - - - new - 运算符自动返回一个引用,因此对 - new 的结果进行引用赋值是错误的。 - - - - - -]]> - - &example.outputs; - - - - - - - 有关引用更多信息参见本手册中 引用的解释 一章。 - - - - - - 算术赋值运算符 - - - - - 例子 - 等同于 - 操作 - - - - - $a += $b - $a = $a + $b - 加法 - - - $a -= $b - $a = $a - $b - 减法 - - - $a *= $b - $a = $a * $b - 乘法 - - - $a /= $b - $a = $a / $b - 除法 - - - $a %= $b - $a = $a % $b - 取模 - - - $a **= $b - $a = $a ** $b - 指数 - - - - - - - - 位赋值运算符 - - - - - 例子 - 等同于 - 操作 - - - - - $a &= $b - $a = $a & $b - 按位与 - - - $a |= $b - $a = $a | $b - 按位或 - - - $a ^= $b - $a = $a ^ $b - 按位异或 - - - $a <<= $b - $a = $a << $b - 左移 - - - $a >>= $b - $a = $a >> $b - 右移 - - - - - - - - 其他赋值运算符 - - - - - 例子 - 等同于 - 操作 - - - - - $a .= $b - $a = $a . $b - 字符串拼接 - - - $a ??= $b - $a = $a ?? $b - NULL 合并 - - - - - - - - &reftitle.seealso; - - - 算术运算符 - 位运算符 - NULL 合并运算符 - - - - - - - - 位运算符 - - 位运算符允许对整型数中指定的位进行求值和操作。 - - - - 位运算符 - - - - 例子 - 名称 - 结果 - - - - - $a & $b - And(按位与) - 将把 $a$b 中都为 1 的位设为 1。 - - - $a | $b - Or(按位或) - 将把 $a$b 中任何一个为 1 的位设为 1。 - - - $a ^ $b - Xor(按位异或) - 将把 $a$b 中一个为 1 另一个为 0 的位设为 1。 - - - ~ $a - Not(按位取反) - $a 中为 0 的位设为 1,反之亦然。 - - - $a << $b - Shift left(左移) - $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。 - - - $a >> $b - Shift right(右移) - $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。 - - - -
- - 位移在 PHP 中是数学运算。向任何方向移出去的位都被丢弃。左移时右侧以零填充,符号位被移走意味着正负号不被保留。右移时左侧以符号位填充,意味着正负号被保留。 - - - 要用括号确保想要的优先级。例如 - $a & $b == true 先进行比较再进行按位与;而 - ($a & $b) == true 则先进行按位与再进行比较。 - - - 如果 &| 和 - ^ 运算符的左右两个操作对象都是字符串,将对会组成字符串的字符 - ASCII 值执行操作,结果也是一个字符串。除此之外,两个操作对象都将 - 转换为整数 ,结果也将会是整数。 - - - 如果 ~ 运算符的操作对象是字符串,则将对组成字符串的字符 ASCII 值进行操作, - 结果将会是字符串,否则操作对象和结构都会是整数。 - - - <<>> 运算符的操作对象和结果始终都是整数。 - - - - - -PHP 的 ini 设定 error_reporting 使用了按位的值, -提供了关闭某个位的真实例子。要显示除了提示级别 -之外的所有错误,php.ini 中是这样用的: -E_ALL & ~E_NOTICE - - - - -具体运作方式是先取得 E_ALL 的值: -00000000000000000111011111111111 -再取得 E_NOTICE 的值: -00000000000000000000000000001000 -然后通过 ~ 将其取反: -11111111111111111111111111110111 -最后再用按位与 AND(&)得到两个值中都设定了(为 1)的位: -00000000000000000111011111110111 - - - - -另外一个方法是用按位异或 XOR(^)来取得只在 -其中一个值中设定了的位: -E_ALL ^ E_NOTICE - - - - - - - - -error_reporting 也可用来演示怎样置位。只显示错误和可恢复 -错误的方法是: -E_ERROR | E_RECOVERABLE_ERROR - - - - -也就是将 E_ERROR -00000000000000000000000000000001 -和 E_RECOVERABLE_ERROR -00000000000000000001000000000000 -用按位或 OR(|)运算符来取得在任何一个值中被置位的结果: -00000000000000000001000000000001 - - - - - - - 整数的 AND,OR 和 XOR 位运算符 - - -]]> - - &example.outputs; - - - - - - - - 字符串的 XOR 运算符 - - -]]> - - - - - - 整数的位移 - -> $places; -p($res, $val, '>>', $places, 'copy of sign bit shifted into left side'); - -$val = 4; -$places = 2; -$res = $val >> $places; -p($res, $val, '>>', $places); - -$val = 4; -$places = 3; -$res = $val >> $places; -p($res, $val, '>>', $places, 'bits shift out right side'); - -$val = 4; -$places = 4; -$res = $val >> $places; -p($res, $val, '>>', $places, 'same result as above; can not shift beyond 0'); - - -echo "\n--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---\n"; - -$val = -4; -$places = 1; -$res = $val >> $places; -p($res, $val, '>>', $places, 'copy of sign bit shifted into left side'); - -$val = -4; -$places = 2; -$res = $val >> $places; -p($res, $val, '>>', $places, 'bits shift out right side'); - -$val = -4; -$places = 3; -$res = $val >> $places; -p($res, $val, '>>', $places, 'same result as above; can not shift beyond -1'); - - -echo "\n--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---\n"; - -$val = 4; -$places = 1; -$res = $val << $places; -p($res, $val, '<<', $places, 'zeros fill in right side'); - -$val = 4; -$places = (PHP_INT_SIZE * 8) - 4; -$res = $val << $places; -p($res, $val, '<<', $places); - -$val = 4; -$places = (PHP_INT_SIZE * 8) - 3; -$res = $val << $places; -p($res, $val, '<<', $places, 'sign bits get shifted out'); - -$val = 4; -$places = (PHP_INT_SIZE * 8) - 2; -$res = $val << $places; -p($res, $val, '<<', $places, 'bits shift out left side'); - - -echo "\n--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---\n"; - -$val = -4; -$places = 1; -$res = $val << $places; -p($res, $val, '<<', $places, 'zeros fill in right side'); - -$val = -4; -$places = (PHP_INT_SIZE * 8) - 3; -$res = $val << $places; -p($res, $val, '<<', $places); - -$val = -4; -$places = (PHP_INT_SIZE * 8) - 2; -$res = $val << $places; -p($res, $val, '<<', $places, 'bits shift out left side, including sign bit'); - - -/* - * 忽略顶部, - * 它只是为了使输出更加清晰而格式化。 - */ - -function p($res, $val, $op, $places, $note = '') { - $format = '%0' . (PHP_INT_SIZE * 8) . "b\n"; - - printf("Expression: %d = %d %s %d\n", $res, $val, $op, $places); - - echo " Decimal:\n"; - printf(" val=%d\n", $val); - printf(" res=%d\n", $res); - - echo " Binary:\n"; - printf(' val=' . $format, $val); - printf(' res=' . $format, $res); - - if ($note) { - echo " NOTE: $note\n"; - } - - echo "\n"; -} -?> -]]> - - &example.outputs.32bit; - -> 1 - Decimal: - val=4 - res=2 - Binary: - val=00000000000000000000000000000100 - res=00000000000000000000000000000010 - NOTE: copy of sign bit shifted into left side - -Expression: 1 = 4 >> 2 - Decimal: - val=4 - res=1 - Binary: - val=00000000000000000000000000000100 - res=00000000000000000000000000000001 - -Expression: 0 = 4 >> 3 - Decimal: - val=4 - res=0 - Binary: - val=00000000000000000000000000000100 - res=00000000000000000000000000000000 - NOTE: bits shift out right side - -Expression: 0 = 4 >> 4 - Decimal: - val=4 - res=0 - Binary: - val=00000000000000000000000000000100 - res=00000000000000000000000000000000 - NOTE: same result as above; can not shift beyond 0 - - ---- BIT SHIFT RIGHT ON NEGATIVE INTEGERS --- -Expression: -2 = -4 >> 1 - Decimal: - val=-4 - res=-2 - Binary: - val=11111111111111111111111111111100 - res=11111111111111111111111111111110 - NOTE: copy of sign bit shifted into left side - -Expression: -1 = -4 >> 2 - Decimal: - val=-4 - res=-1 - Binary: - val=11111111111111111111111111111100 - res=11111111111111111111111111111111 - NOTE: bits shift out right side - -Expression: -1 = -4 >> 3 - Decimal: - val=-4 - res=-1 - Binary: - val=11111111111111111111111111111100 - res=11111111111111111111111111111111 - NOTE: same result as above; can not shift beyond -1 - - ---- BIT SHIFT LEFT ON POSITIVE INTEGERS --- -Expression: 8 = 4 << 1 - Decimal: - val=4 - res=8 - Binary: - val=00000000000000000000000000000100 - res=00000000000000000000000000001000 - NOTE: zeros fill in right side - -Expression: 1073741824 = 4 << 28 - Decimal: - val=4 - res=1073741824 - Binary: - val=00000000000000000000000000000100 - res=01000000000000000000000000000000 - -Expression: -2147483648 = 4 << 29 - Decimal: - val=4 - res=-2147483648 - Binary: - val=00000000000000000000000000000100 - res=10000000000000000000000000000000 - NOTE: sign bits get shifted out - -Expression: 0 = 4 << 30 - Decimal: - val=4 - res=0 - Binary: - val=00000000000000000000000000000100 - res=00000000000000000000000000000000 - NOTE: bits shift out left side - - ---- BIT SHIFT LEFT ON NEGATIVE INTEGERS --- -Expression: -8 = -4 << 1 - Decimal: - val=-4 - res=-8 - Binary: - val=11111111111111111111111111111100 - res=11111111111111111111111111111000 - NOTE: zeros fill in right side - -Expression: -2147483648 = -4 << 29 - Decimal: - val=-4 - res=-2147483648 - Binary: - val=11111111111111111111111111111100 - res=10000000000000000000000000000000 - -Expression: 0 = -4 << 30 - Decimal: - val=-4 - res=0 - Binary: - val=11111111111111111111111111111100 - res=00000000000000000000000000000000 - NOTE: bits shift out left side, including sign bit -]]> - - &example.outputs.64bit; - -> 1 - Decimal: - val=4 - res=2 - Binary: - val=0000000000000000000000000000000000000000000000000000000000000100 - res=0000000000000000000000000000000000000000000000000000000000000010 - NOTE: copy of sign bit shifted into left side - -Expression: 1 = 4 >> 2 - Decimal: - val=4 - res=1 - Binary: - val=0000000000000000000000000000000000000000000000000000000000000100 - res=0000000000000000000000000000000000000000000000000000000000000001 - -Expression: 0 = 4 >> 3 - Decimal: - val=4 - res=0 - Binary: - val=0000000000000000000000000000000000000000000000000000000000000100 - res=0000000000000000000000000000000000000000000000000000000000000000 - NOTE: bits shift out right side - -Expression: 0 = 4 >> 4 - Decimal: - val=4 - res=0 - Binary: - val=0000000000000000000000000000000000000000000000000000000000000100 - res=0000000000000000000000000000000000000000000000000000000000000000 - NOTE: same result as above; can not shift beyond 0 - - ---- BIT SHIFT RIGHT ON NEGATIVE INTEGERS --- -Expression: -2 = -4 >> 1 - Decimal: - val=-4 - res=-2 - Binary: - val=1111111111111111111111111111111111111111111111111111111111111100 - res=1111111111111111111111111111111111111111111111111111111111111110 - NOTE: copy of sign bit shifted into left side - -Expression: -1 = -4 >> 2 - Decimal: - val=-4 - res=-1 - Binary: - val=1111111111111111111111111111111111111111111111111111111111111100 - res=1111111111111111111111111111111111111111111111111111111111111111 - NOTE: bits shift out right side - -Expression: -1 = -4 >> 3 - Decimal: - val=-4 - res=-1 - Binary: - val=1111111111111111111111111111111111111111111111111111111111111100 - res=1111111111111111111111111111111111111111111111111111111111111111 - NOTE: same result as above; can not shift beyond -1 - - ---- BIT SHIFT LEFT ON POSITIVE INTEGERS --- -Expression: 8 = 4 << 1 - Decimal: - val=4 - res=8 - Binary: - val=0000000000000000000000000000000000000000000000000000000000000100 - res=0000000000000000000000000000000000000000000000000000000000001000 - NOTE: zeros fill in right side - -Expression: 4611686018427387904 = 4 << 60 - Decimal: - val=4 - res=4611686018427387904 - Binary: - val=0000000000000000000000000000000000000000000000000000000000000100 - res=0100000000000000000000000000000000000000000000000000000000000000 - -Expression: -9223372036854775808 = 4 << 61 - Decimal: - val=4 - res=-9223372036854775808 - Binary: - val=0000000000000000000000000000000000000000000000000000000000000100 - res=1000000000000000000000000000000000000000000000000000000000000000 - NOTE: sign bits get shifted out - -Expression: 0 = 4 << 62 - Decimal: - val=4 - res=0 - Binary: - val=0000000000000000000000000000000000000000000000000000000000000100 - res=0000000000000000000000000000000000000000000000000000000000000000 - NOTE: bits shift out left side - - ---- BIT SHIFT LEFT ON NEGATIVE INTEGERS --- -Expression: -8 = -4 << 1 - Decimal: - val=-4 - res=-8 - Binary: - val=1111111111111111111111111111111111111111111111111111111111111100 - res=1111111111111111111111111111111111111111111111111111111111111000 - NOTE: zeros fill in right side - -Expression: -9223372036854775808 = -4 << 61 - Decimal: - val=-4 - res=-9223372036854775808 - Binary: - val=1111111111111111111111111111111111111111111111111111111111111100 - res=1000000000000000000000000000000000000000000000000000000000000000 - -Expression: 0 = -4 << 62 - Decimal: - val=-4 - res=0 - Binary: - val=1111111111111111111111111111111111111111111111111111111111111100 - res=0000000000000000000000000000000000000000000000000000000000000000 - NOTE: bits shift out left side, including sign bit -]]> - - - - - - 使用 gmp 扩展对超出 PHP_INT_MAX 的数值来进行位操作。 - - - - - &reftitle.seealso; - - - - pack - unpack - gmp_and - gmp_or - gmp_xor - gmp_testbit - gmp_clrbit - - - -
- - - 比较运算符 - - 比较运算符,如同它们名称所暗示的,允许对两个值进行比较。还可以参考 - PHP 类型比较表看不同类型相互比较的例子。 - - - 比较运算符 - - - - 例子 - 名称 - 结果 - - - - - $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的 int 值。 - - - - -
- - 当两个操作对象都是 - 数字字符串, - 或一个是数字另一个是 - 数字字符串, - 就会自动按照数值进行比较。 - 此规则也适用于 - switch 语句。 - 当比较时用的是 ===!==, - 则不会进行类型转换——因为不仅要对比数值,还要对比类型。 - - - - PHP 8.0.0 之前,如果 string 与数字或者数字字符串进行比较, - 则在比较前会将 string 转化为数字。 - 在如下示例中会出现不可预料的结果: - - - -]]> - - &example.outputs.7; - - - - &example.outputs.8; - - - - - - - - - - - 1; // 0 -echo 1 <=> 2; // -1 -echo 2 <=> 1; // 1 - -// 浮点数 -echo 1.5 <=> 1.5; // 0 -echo 1.5 <=> 2.5; // -1 -echo 2.5 <=> 1.5; // 1 - -// 字符串 -echo "a" <=> "a"; // 0 -echo "a" <=> "b"; // -1 -echo "b" <=> "a"; // 1 - -echo "a" <=> "aa"; // -1 -echo "zz" <=> "aa"; // 1 - -// 数组 -echo [] <=> []; // 0 -echo [1, 2, 3] <=> [1, 2, 3]; // 0 -echo [1, 2, 3] <=> []; // 1 -echo [1, 2, 3] <=> [1, 2, 1]; // 1 -echo [1, 2, 3] <=> [1, 2, 4]; // -1 - -// 对象 -$a = (object) ["a" => "b"]; -$b = (object) ["a" => "b"]; -echo $a <=> $b; // 0 - -$a = (object) ["a" => "b"]; -$b = (object) ["a" => "c"]; -echo $a <=> $b; // -1 - -$a = (object) ["a" => "c"]; -$b = (object) ["a" => "b"]; -echo $a <=> $b; // 1 - -// 不仅仅比较值,而且也会匹配键 -$a = (object) ["a" => "b"]; -$b = (object) ["b" => "b"]; -echo $a <=> $b; // 1 - -?> -]]> - - - - - - - 对于多种类型,比较运算符根据下表比较(按顺序)。 - - - 比较多种类型 - - - - 运算数 1 类型 - 运算数 2 类型 - 结果 - - - - - nullstring - string - 将 &null; 转换为 "",进行数字或词汇比较 - - - boolnull - 任何其它类型 - 转换为 bool,&false; < &true; - - - object - object - - 内置类可以定义自己的比较,不同类不能比较,相同的类查看对象比较 - - - - stringresourceintfloat - stringresourceintfloat - 将字符串和资源转换成数字,按普通数学比较 - - - array - array - - 成员越少的数组越小,如果运算数 1 中的键不存在于运算数 - 2 中则数组无法比较,否则挨个值比较(见下例) - - - - object - 任何其它类型 - object 总是更大 - - - array - 任何其它类型 - array 总是更大 - - - -
- - - - Boolean/null comparison - - -]]> - - - - - - - 标准数组比较代码 - - count($op2)) { - return 1; // $op1 > $op2 - } - foreach ($op1 as $key => $val) { - if (!array_key_exists($key, $op2)) { - return 1; - } elseif ($val < $op2[$key]) { - return -1; - } elseif ($val > $op2[$key]) { - return 1; - } - } - return 0; // $op1 == $op2 -} -?> -]]> - - - - - - 比较浮点数 - - - 由于浮点数 float 的内部表达方式,不应比较两个浮点数float是否相等。 - - - - 更多信息参见 float。 - - - - - - 请注意,在比较不同类型的值时,类型转换并不总是很明显,尤其是比较 &integer; 与 &boolean; 或者 - &integer; 与 &string;。因此,在大多数情况下,通常建议使用 === 和 - !== 进行比较而不是 ==!=。 - - - - - 不能比较的值 - - 虽然恒等比较(=== 和 - !==)可以应用于任意值,其它比较运算符应该仅用于可比较的值。不能比较的值的比较的结果是不确定的,不应依赖。 - - - - - &reftitle.seealso; - - - strcasecmp - strcmp - 数组运算符 - 类型 - - - - - - 三元运算符 - - 另一个条件运算符是“?:”(或三元)运算符 。 - - 赋默认值 - - -]]> - - - 表达式 (expr1) ? (expr2) : (expr3) 在 - expr1 求值为 &true; - 时的值为 expr2,在 - expr1 求值为 &false; 时的值为 - expr3。 - - - 可以省略三元运算符中间那部分。表达式 - expr1 ?: expr3 等同于如果 - expr1 求值为 &true; 时返回 - expr1 的结果,否则返回 - expr3expr1 在这里仅执行一次。 - - - - 注意三元运算符是个语句,因此其求值不是变量,而是语句的结果。如果想通过引用返回一个变量这点就很重要。在一个通过引用返回的函数中语句 - return $var == 42 ? $a : $b; 将不起作用,以后的 PHP - 版本会为此发出一条警告。 - - - - - 建议避免将三元运算符堆积在一起使用。和其他语言相比, - 当在单个表达式中使用多个未加括号的三元运算符时会造成 - PHP 运算结果不清晰。 - 甚至在 PHP 8.0.0 之前,三元运算符是从左到右执行的, - 而大多数其他编程语言是从右到左的。 - 自 PHP 7.4.0 起,弃用依靠左联。 - PHP 8.0.0 起,三元运算符是非关联的。 - - 不清晰的三元运算符行为 - - -]]> - - - - - - - 然而,短三元运算符(?:)的链接是稳定且合理的。他将第一个参数进行求值,结果为非假值。注意,未定义的值将会引发警告。 - - Short-ternary chaining - - -]]> - - - - - - - - NULL 合并运算符 - - 另一个简略运算符是 "??" (NULL 合并)运算符。 - - 设置默认值 - - -]]> - - - 当 expr1 为 &null;,表达式 (expr1) ?? (expr2) 等同于 - expr2,否则为 expr1。 - - - 尤其要注意,当不存在左侧的值时,此运算符也和 isset 一样不会产生警告。 - 对于 array 键尤其有用。 - - - - 请注意:NULL 合并运算符是一个表达式,产生的也是表达式结果,而不是变量。 - 返回引用变量时需要强调这一点。 - 因此,在返回引用的函数里就无法使用这样的语句:return $foo ?? $bar;,还会提示警告。 - - - - - null 合并运算符的优先级较低。这意味着如果将它与其它运算符(比如字符串链接或者算术运算符)混合使用,可能需要括号。 - - - -]]> - - - - - 请注意,NULL 合并运算符支持简单的嵌套: - - 嵌套 NULL 合并运算符 - - -]]> - - - - - -
- - - 错误控制运算符 - - PHP 支持一个错误控制运算符:@。当将其放置在一个 PHP - 表达式之前,该表达式可能产生的任何错误诊断都被抑制。 - - - 如果用 set_error_handler - 设定了自定义的错误处理函数,即使诊断信息被抑制,也仍然会被调用。 - - - - - PHP 8.0.0 之前,如果错误被 @ 运算符抑制,则在自定义错误处理程序中调用 error_reporting 将始终返回 - 0。PHP 8.0.0 起,返回值为 E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE。 - - - - - error_get_last 返回数组中的 "message" 元素储存了表达式产生的任意错误信息。 - 此函数的返回结果会随着每次错误的发生而相应变化,所以需要尽早检查。 - - - - - -]]> - - - - - - @ 运算符只对 表达式 有效。 - 对新手来说一个简单的规则就是:如果能从某处获得值,就能在它前面加上 - @ 运算符。例如,可以把它放在变量,函数调用,某些语言构造调用(例如 include )等等之前。 - 不能把它放在函数或类的定义之前,也不能用于条件结构例如 if 和 &foreach; 等。 - - - - - PHP 8.0.0 之前,@ 运算符会禁用导致脚本停止运行的严重错误。 - 例如在调用一个不存在的函数前添加 @,由于函数不可用或者输入错误, - 将会导致脚本终止,而不会说明原因。 - - - - - &reftitle.seealso; - - - error_reporting - 错误处理与日志记录函数 - - - - - - - 执行运算符 - - PHP 支持一个执行运算符:反引号(``)。注意这不是单引号!PHP - 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“`”的效果与函数 - shell_exec 相同。 - - -$output"; -?> -]]> - - - - - - 关闭了 shell_exec 时反引号运算符是无效的。 - - - - - 与其它某些语言不同,反引号不能在双引号字符串中使用。 - - - - - &reftitle.seealso; - - - 程序执行函数 - popen - proc_open - PHP 的命令行模式 - - - - - - - 递增/递减运算符 - - PHP 支持 C 风格的前/后递增与递减运算符。 - - - - 递增/递减运算符不影响布尔值。递减 - &null; 值也没有效果,但是递增 &null; 的结果是 1。 - - - - 递增/递减运算符 - - - - 例子 - 名称 - 效果 - - - - - ++$a - 前加 - $a 的值加一,然后返回 $a - - - $a++ - 后加 - 返回 $a,然后将 $a 的值加一。 - - - --$a - 前减 - $a 的值减一, 然后返回 $a - - - $a-- - 后减 - 返回 $a,然后将 $a 的值减一。 - - - -
- - 一个简单的示例脚本: - - -Postincrement"; -$a = 5; -echo "Should be 5: " . $a++ . "
\n"; -echo "Should be 6: " . $a . "
\n"; - -echo "

Preincrement

"; -$a = 5; -echo "Should be 6: " . ++$a . "
\n"; -echo "Should be 6: " . $a . "
\n"; - -echo "

Postdecrement

"; -$a = 5; -echo "Should be 5: " . $a-- . "
\n"; -echo "Should be 4: " . $a . "
\n"; - -echo "

Predecrement

"; -$a = 5; -echo "Should be 4: " . --$a . "
\n"; -echo "Should be 4: " . $a . "
\n"; -?> -]]> -
-
-
- - 在处理字符变量的算数运算时,PHP 沿袭了 Perl 的习惯,而非 C 的。例如,在 - Perl 中 $a = 'Z'; $a++; 将把 $a - 变成'AA',而在 C 中,a = 'Z'; a++; 将把 - a 变成 '[''Z' - 的 ASCII 值是 90,'[' 的 ASCII 值是 - 91)。注意字符变量只能递增,不能递减,并且只支持纯 ASCII 字母数字(a-z、A-Z 和 - 0-9)。递增/递减其他字符变量则无效,原字符串没有变化。 - - 涉及字符变量的算数运算 - - -]]> - - &example.outputs; - - - - - - - 递增或递减布尔值没有效果。 - -
- - - 逻辑运算符 - - - 逻辑运算符 - - - - 例子 - 名称 - 结果 - - - - - $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;。 - - - -
- - “与”和“或”有两种不同形式运算符的原因是它们运算的优先级不同(见运算符优先级)。 - - - 逻辑运算符示例 - - -]]> - - &example.outputs.similar; - - - - -
- - - 字符串运算符 - - 有两个字符串(string)运算符。第一个是连接运算符(“.”),它返回其左右参数连接后的字符串。第二个是连接赋值运算符(“.=”),它将右边参数附加到左边的参数之后。更多信息见赋值运算符。 - - - - - - -]]> - - - - - - &reftitle.seealso; - - - 字符串类型 - 字符串函数 - - - - - - - 数组运算符 - - 数组运算符 - - - - 例子 - 名称 - 结果 - - - - - $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;。 - - - -
- - + 运算符把右边的数组元素附加到左边的数组后面,两个数组中都有的键名,则只用左边数组中的,右边的被忽略。 - - - - - "apple", "b" => "banana"); -$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry"); - -$c = $a + $b; // $a 和 $b 的并集 -echo "Union of \$a and \$b: \n"; -var_dump($c); - -$c = $b + $a; // $b 和 $a 的并集 -echo "Union of \$b and \$a: \n"; -var_dump($c); - -$a += $b; // $a += $b 的并集是 $a 和 $b -echo "Union of \$a += \$b: \n"; -var_dump($a); -?> -]]> - - - 执行后,此脚本会显示: - - - string(5) "apple" - ["b"]=> - string(6) "banana" - ["c"]=> - string(6) "cherry" -} -Union of $b and $a: -array(3) { - ["a"]=> - string(4) "pear" - ["b"]=> - string(10) "strawberry" - ["c"]=> - string(6) "cherry" -} -Union of $a += $b: -array(3) { - 'a' => - string(5) "apple" - 'b' => - string(6) "banana" - 'c' => - string(6) "cherry" -} -]]> - - - - 数组中的单元如果具有相同的键名和值则比较时相等。 - - - - 比较数组 - - "banana", "0" => "apple"); - -var_dump($a == $b); // bool(true) -var_dump($a === $b); // bool(false) -?> -]]> - - - - - - &reftitle.seealso; - - - 数组类型 - 数组函数 - - - -
- - - 类型运算符 - - instanceof 用于确定一个 PHP 变量是否属于某一类 - class 的实例: - - 对类使用 <literal>instanceof</literal> - - -]]> - - &example.outputs; - - - - - - - instanceof 也可用来确定一个变量是不是继承自某一父类的子类的实例: - - 对继承类使用 <literal>instanceof</literal> - - -]]> - - &example.outputs; - - - - - - - 检查一个对象是否不是某个类的实例,可以使用逻辑运算符 not。 - - 使用 <literal>instanceof</literal> 检查对象<emphasis>不是</emphasis>某个类的实例 - - -]]> - - &example.outputs; - - - - - - - 最后,instanceof也可用于确定一个变量是不是实现了某个接口的对象的实例: - - 对接口使用 <literal>instanceof</literal> - - -]]> - - &example.outputs; - - - - - - - 虽然 instanceof 通常直接与类名一起使用,但也可以使用对象或字符串变量: - - 对其它变量使用 <literal>instanceof</literal> - - -]]> - - &example.outputs; - - - - - - - 如果被检测的变量不是对象,instanceof 并不发出任何错误信息而是返回 - &false;。PHP 7.3.0 之前不允许用于检测常量。 - - 用 <literal>instanceof</literal> 检测其它变量 - - -]]> - - &example.outputs; - - - - - - PHP 7.3.0 起, - instanceof 操作符的左侧可以放常量。 - - 使用 <literal>instanceof</literal> 测试常量 - - -]]> - - &example.outputs.73; - - - - - - - PHP 8.0.0 起, instanceof 可以与任何表达式一起使用。表达式必须使用括号括起来并且生成 - string。 - - - 将 <literal>instanceof</literal> 与任意表达式一起使用 - - -]]> - - &example.outputs.8; - - - - - - - instanceof 在功能上有个 - 类似的变体 is_a。 - - - - &reftitle.seealso; - - - get_class - is_a - - - - -
- + + 运算符 + + 运算符是可以通过给出的一或多个值(用编程行话来说,表达式)来产生另一个值(因而整个结构成为一个表达式)的东西。 + + + 运算符可按照其能接受几个值来分组。一元运算符只能接受一个值,例如 + !逻辑取反运算符)或 + ++递增运算符)。 + 二元运算符可接受两个值,例如熟悉的算术运算符 + +(加)和 -(减),大多数 PHP + 运算符都是这种。最后是唯一的三元运算符 ? :,可接受三个值;通常就简单称之为“三元运算符”(尽管称之为条件运算符可能更合适)。 + + + PHP 的运算符完整列表见下节运算符优先级。该节也解释了运算符优先级和结合方向,这控制着在表达式包含有若干个不同运算符时究竟怎样对其求值。 + + + &language.operators.precedence; + &language.operators.arithmetic; + &language.operators.increment; + &language.operators.assignment; + &language.operators.bitwise; + &language.operators.comparison; + &language.operators.errorcontrol; + &language.operators.execution; + &language.operators.logical; + &language.operators.string; + &language.operators.array; + &language.operators.type; + + + + 算术运算符 + + 还记得学校里学到的基本数学知识吗?就和它们一样。 + + + 算术运算符 + + + + 例子 + 名称 + 结果 + + + + + +$a + 标识 + + 根据情况将 $a 转化为 int 或 + float。 + + + + -$a + 取反 + $a 的负值。 + + + $a + $b + 加法 + $a$b 的和。 + + + $a - $b + 减法 + $a$b 的差。 + + + $a * $b + 乘法 + $a$b 的积。 + + + $a / $b + 除法 + $a 除以 $b 的商。 + + + $a % $b + 取模 + $a 除以 $b 的余数。 + + + $a ** $b + 求幂 + $a$b次方的值。 + + + +
+ + 除法运算符总是返回浮点数。只有在下列情况例外:两个操作数都是整数(或字符串转换成的整数)并且正好能整除,这时它返回一个整数。 + 整数除法可参考 intdiv。 + + + 取模运算符的操作数在运算之前都会转换成 int 。 浮点数取模可参考 + fmod。 + + + 取模运算符 % 的结果和被除数的符号(正负号)相同。即 + $a % $b 的结果和 $a 的符号相同。例如: + + + +]]> + + + + + &reftitle.seealso; + + + 数学函数 + + + + +
\ No newline at end of file diff --git a/language/operators/array.xml b/language/operators/array.xml new file mode 100644 index 0000000000..2a983ee449 --- /dev/null +++ b/language/operators/array.xml @@ -0,0 +1,137 @@ + + + + 数组运算符 + + 数组运算符 + + + + 例子 + 名称 + 结果 + + + + + $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;。 + + + +
+ + + 运算符把右边的数组元素附加到左边的数组后面,两个数组中都有的键名,则只用左边数组中的,右边的被忽略。 + + + + + "apple", "b" => "banana"); +$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry"); + +$c = $a + $b; // $a 和 $b 的并集 +echo "Union of \$a and \$b: \n"; +var_dump($c); + +$c = $b + $a; // $b 和 $a 的并集 +echo "Union of \$b and \$a: \n"; +var_dump($c); + +$a += $b; // $a += $b 的并集是 $a 和 $b +echo "Union of \$a += \$b: \n"; +var_dump($a); +?> +]]> + + + 执行后,此脚本会显示: + + + string(5) "apple" + ["b"]=> + string(6) "banana" + ["c"]=> + string(6) "cherry" +} +Union of $b and $a: +array(3) { + ["a"]=> + string(4) "pear" + ["b"]=> + string(10) "strawberry" + ["c"]=> + string(6) "cherry" +} +Union of $a += $b: +array(3) { + ["a"]=> + string(5) "apple" + ["b"]=> + string(6) "banana" + ["c"]=> + string(6) "cherry" +} +]]> + + + + 数组中的单元如果具有相同的键名和值则比较时相等。 + + + + 比较数组 + + "banana", "0" => "apple"); + +var_dump($a == $b); // bool(true) +var_dump($a === $b); // bool(false) +?> +]]> + + + + + + &reftitle.seealso; + + + 数组类型 + 数组函数 + + + +
diff --git a/language/operators/assignment.xml b/language/operators/assignment.xml new file mode 100644 index 0000000000..62743f2d90 --- /dev/null +++ b/language/operators/assignment.xml @@ -0,0 +1,235 @@ + + + + 赋值运算符 + + 基本的赋值运算符是“=”。一开始可能会以为它是“等于”,其实不是的。它实际上意味着把右边表达式的值赋给左边的运算数。 + + + 赋值运算表达式的值也就是所赋的值。也就是说,“$a = 3”的值是 3。这样就可以做一些小技巧: + + + +]]> + + + + + + 在基本赋值运算符之外,还有适合于所有二元算术,数组集合和字符串运算符的“组合运算符”,这样可以在一个表达式中使用它的值并把表达式的结果赋给它,例如: + + + +]]> + + + + + 注意赋值运算将原变量的值拷贝到新变量中(传值赋值),所以改变其中一个并不影响另一个。这也适合于在密集循环中拷贝一些值例如大数组。 + + + 在 PHP 中普通的传值赋值行为有个例外就是碰到对象 object 时,在 + PHP 5 中是以引用赋值的,除非明确使用了 clone 关键字来拷贝。 + + + + 引用赋值 + + PHP 支持引用赋值,使用“$var + = &$othervar;”语法。引用赋值意味着两个变量指向了同一个数据,没有拷贝任何东西。 + + + + 引用赋值 + + +]]> + + + + + new + 运算符自动返回一个引用,因此对 + new 的结果进行引用赋值是错误的。 + + + + + +]]> + + &example.outputs; + + + + + + + 有关引用更多信息参见本手册中 引用的解释 一章。 + + + + + + 算术赋值运算符 + + + + + 例子 + 等同于 + 操作 + + + + + $a += $b + $a = $a + $b + 加法 + + + $a -= $b + $a = $a - $b + 减法 + + + $a *= $b + $a = $a * $b + 乘法 + + + $a /= $b + $a = $a / $b + 除法 + + + $a %= $b + $a = $a % $b + 取模 + + + $a **= $b + $a = $a ** $b + 指数 + + + + + + + + 位赋值运算符 + + + + + 例子 + 等同于 + 操作 + + + + + $a &= $b + $a = $a & $b + 按位与 + + + $a |= $b + $a = $a | $b + 按位或 + + + $a ^= $b + $a = $a ^ $b + 按位异或 + + + $a <<= $b + $a = $a << $b + 左移 + + + $a >>= $b + $a = $a >> $b + 右移 + + + + + + + + 其他赋值运算符 + + + + + 例子 + 等同于 + 操作 + + + + + $a .= $b + $a = $a . $b + 字符串拼接 + + + $a ??= $b + $a = $a ?? $b + NULL 合并 + + + + + + + + &reftitle.seealso; + + + 算术运算符 + 位运算符 + NULL 合并运算符 + + + + + diff --git a/language/operators/bitwise.xml b/language/operators/bitwise.xml new file mode 100644 index 0000000000..1cb36e3526 --- /dev/null +++ b/language/operators/bitwise.xml @@ -0,0 +1,640 @@ + + + + 位运算符 + + 位运算符允许对整型数中指定的位进行求值和操作。 + + + + 位运算符 + + + + 例子 + 名称 + 结果 + + + + + $a & $b + And(按位与) + 将把 $a$b 中都为 1 的位设为 1。 + + + $a | $b + Or(按位或) + 将把 $a$b 中任何一个为 1 的位设为 1。 + + + $a ^ $b + Xor(按位异或) + 将把 $a$b 中一个为 1 另一个为 0 的位设为 1。 + + + ~ $a + Not(按位取反) + $a 中为 0 的位设为 1,反之亦然。 + + + $a << $b + Shift left(左移) + $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。 + + + $a >> $b + Shift right(右移) + $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。 + + + +
+ + 位移在 PHP 中是数学运算。向任何方向移出去的位都被丢弃。左移时右侧以零填充,符号位被移走意味着正负号不被保留。右移时左侧以符号位填充,意味着正负号被保留。 + + + 要用括号确保想要的优先级。例如 + $a & $b == true 先进行比较再进行按位与;而 + ($a & $b) == true 则先进行按位与再进行比较。 + + + 如果 &| 和 + ^ 运算符的左右两个操作对象都是字符串,将对会组成字符串的字符 + ASCII 值执行操作,结果也是一个字符串。除此之外,两个操作对象都将 + 转换为整数 ,结果也将会是整数。 + + + 如果 ~ 运算符的操作对象是字符串,则将对组成字符串的字符 ASCII 值进行操作, + 结果将会是字符串,否则操作对象和结构都会是整数。 + + + <<>> 运算符的操作对象和结果始终都是整数。 + + + + + + PHP 的 ini 设定 error_reporting 使用了按位的值, + 提供了关闭某个位的真实例子。要显示除了提示级别 + 之外的所有错误,php.ini 中是这样用的: + E_ALL & ~E_NOTICE + + + + + 具体运作方式是先取得 E_ALL 的值: + 00000000000000000111011111111111 + 再取得 E_NOTICE 的值: + 00000000000000000000000000001000 + 然后通过 ~ 将其取反: + 11111111111111111111111111110111 + 最后再用按位与 AND(&)得到两个值中都设定了(为 1)的位: + 00000000000000000111011111110111 + + + + + 另外一个方法是用按位异或 XOR(^)来取得只在 + 其中一个值中设定了的位: + E_ALL ^ E_NOTICE + + + + + + + + + error_reporting 也可用来演示怎样置位。只显示错误和可恢复 + 错误的方法是: + E_ERROR | E_RECOVERABLE_ERROR + + + + + 也就是将 E_ERROR + 00000000000000000000000000000001 + 和 E_RECOVERABLE_ERROR + 00000000000000000001000000000000 + 用按位或 OR(|)运算符来取得在任何一个值中被置位的结果: + 00000000000000000001000000000001 + + + + + + + 整数的 AND,OR 和 XOR 位运算符 + + +]]> + + &example.outputs; + + + + + + + + 字符串的 XOR 运算符 + + +]]> + + + + + + 整数的位移 + +> $places; +p($res, $val, '>>', $places, 'copy of sign bit shifted into left side'); + +$val = 4; +$places = 2; +$res = $val >> $places; +p($res, $val, '>>', $places); + +$val = 4; +$places = 3; +$res = $val >> $places; +p($res, $val, '>>', $places, 'bits shift out right side'); + +$val = 4; +$places = 4; +$res = $val >> $places; +p($res, $val, '>>', $places, 'same result as above; can not shift beyond 0'); + + +echo "\n--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---\n"; + +$val = -4; +$places = 1; +$res = $val >> $places; +p($res, $val, '>>', $places, 'copy of sign bit shifted into left side'); + +$val = -4; +$places = 2; +$res = $val >> $places; +p($res, $val, '>>', $places, 'bits shift out right side'); + +$val = -4; +$places = 3; +$res = $val >> $places; +p($res, $val, '>>', $places, 'same result as above; can not shift beyond -1'); + + +echo "\n--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---\n"; + +$val = 4; +$places = 1; +$res = $val << $places; +p($res, $val, '<<', $places, 'zeros fill in right side'); + +$val = 4; +$places = (PHP_INT_SIZE * 8) - 4; +$res = $val << $places; +p($res, $val, '<<', $places); + +$val = 4; +$places = (PHP_INT_SIZE * 8) - 3; +$res = $val << $places; +p($res, $val, '<<', $places, 'sign bits get shifted out'); + +$val = 4; +$places = (PHP_INT_SIZE * 8) - 2; +$res = $val << $places; +p($res, $val, '<<', $places, 'bits shift out left side'); + + +echo "\n--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---\n"; + +$val = -4; +$places = 1; +$res = $val << $places; +p($res, $val, '<<', $places, 'zeros fill in right side'); + +$val = -4; +$places = (PHP_INT_SIZE * 8) - 3; +$res = $val << $places; +p($res, $val, '<<', $places); + +$val = -4; +$places = (PHP_INT_SIZE * 8) - 2; +$res = $val << $places; +p($res, $val, '<<', $places, 'bits shift out left side, including sign bit'); + + +/* + * 忽略顶部, + * 它只是为了使输出更加清晰而格式化。 + */ + +function p($res, $val, $op, $places, $note = '') { + $format = '%0' . (PHP_INT_SIZE * 8) . "b\n"; + + printf("Expression: %d = %d %s %d\n", $res, $val, $op, $places); + + echo " Decimal:\n"; + printf(" val=%d\n", $val); + printf(" res=%d\n", $res); + + echo " Binary:\n"; + printf(' val=' . $format, $val); + printf(' res=' . $format, $res); + + if ($note) { + echo " NOTE: $note\n"; + } + + echo "\n"; +} +?> +]]> + + &example.outputs.32bit; + +> 1 + Decimal: + val=4 + res=2 + Binary: + val=00000000000000000000000000000100 + res=00000000000000000000000000000010 + NOTE: copy of sign bit shifted into left side + +Expression: 1 = 4 >> 2 + Decimal: + val=4 + res=1 + Binary: + val=00000000000000000000000000000100 + res=00000000000000000000000000000001 + +Expression: 0 = 4 >> 3 + Decimal: + val=4 + res=0 + Binary: + val=00000000000000000000000000000100 + res=00000000000000000000000000000000 + NOTE: bits shift out right side + +Expression: 0 = 4 >> 4 + Decimal: + val=4 + res=0 + Binary: + val=00000000000000000000000000000100 + res=00000000000000000000000000000000 + NOTE: same result as above; can not shift beyond 0 + + +--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS --- +Expression: -2 = -4 >> 1 + Decimal: + val=-4 + res=-2 + Binary: + val=11111111111111111111111111111100 + res=11111111111111111111111111111110 + NOTE: copy of sign bit shifted into left side + +Expression: -1 = -4 >> 2 + Decimal: + val=-4 + res=-1 + Binary: + val=11111111111111111111111111111100 + res=11111111111111111111111111111111 + NOTE: bits shift out right side + +Expression: -1 = -4 >> 3 + Decimal: + val=-4 + res=-1 + Binary: + val=11111111111111111111111111111100 + res=11111111111111111111111111111111 + NOTE: same result as above; can not shift beyond -1 + + +--- BIT SHIFT LEFT ON POSITIVE INTEGERS --- +Expression: 8 = 4 << 1 + Decimal: + val=4 + res=8 + Binary: + val=00000000000000000000000000000100 + res=00000000000000000000000000001000 + NOTE: zeros fill in right side + +Expression: 1073741824 = 4 << 28 + Decimal: + val=4 + res=1073741824 + Binary: + val=00000000000000000000000000000100 + res=01000000000000000000000000000000 + +Expression: -2147483648 = 4 << 29 + Decimal: + val=4 + res=-2147483648 + Binary: + val=00000000000000000000000000000100 + res=10000000000000000000000000000000 + NOTE: sign bits get shifted out + +Expression: 0 = 4 << 30 + Decimal: + val=4 + res=0 + Binary: + val=00000000000000000000000000000100 + res=00000000000000000000000000000000 + NOTE: bits shift out left side + + +--- BIT SHIFT LEFT ON NEGATIVE INTEGERS --- +Expression: -8 = -4 << 1 + Decimal: + val=-4 + res=-8 + Binary: + val=11111111111111111111111111111100 + res=11111111111111111111111111111000 + NOTE: zeros fill in right side + +Expression: -2147483648 = -4 << 29 + Decimal: + val=-4 + res=-2147483648 + Binary: + val=11111111111111111111111111111100 + res=10000000000000000000000000000000 + +Expression: 0 = -4 << 30 + Decimal: + val=-4 + res=0 + Binary: + val=11111111111111111111111111111100 + res=00000000000000000000000000000000 + NOTE: bits shift out left side, including sign bit +]]> + + &example.outputs.64bit; + +> 1 + Decimal: + val=4 + res=2 + Binary: + val=0000000000000000000000000000000000000000000000000000000000000100 + res=0000000000000000000000000000000000000000000000000000000000000010 + NOTE: copy of sign bit shifted into left side + +Expression: 1 = 4 >> 2 + Decimal: + val=4 + res=1 + Binary: + val=0000000000000000000000000000000000000000000000000000000000000100 + res=0000000000000000000000000000000000000000000000000000000000000001 + +Expression: 0 = 4 >> 3 + Decimal: + val=4 + res=0 + Binary: + val=0000000000000000000000000000000000000000000000000000000000000100 + res=0000000000000000000000000000000000000000000000000000000000000000 + NOTE: bits shift out right side + +Expression: 0 = 4 >> 4 + Decimal: + val=4 + res=0 + Binary: + val=0000000000000000000000000000000000000000000000000000000000000100 + res=0000000000000000000000000000000000000000000000000000000000000000 + NOTE: same result as above; can not shift beyond 0 + + +--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS --- +Expression: -2 = -4 >> 1 + Decimal: + val=-4 + res=-2 + Binary: + val=1111111111111111111111111111111111111111111111111111111111111100 + res=1111111111111111111111111111111111111111111111111111111111111110 + NOTE: copy of sign bit shifted into left side + +Expression: -1 = -4 >> 2 + Decimal: + val=-4 + res=-1 + Binary: + val=1111111111111111111111111111111111111111111111111111111111111100 + res=1111111111111111111111111111111111111111111111111111111111111111 + NOTE: bits shift out right side + +Expression: -1 = -4 >> 3 + Decimal: + val=-4 + res=-1 + Binary: + val=1111111111111111111111111111111111111111111111111111111111111100 + res=1111111111111111111111111111111111111111111111111111111111111111 + NOTE: same result as above; can not shift beyond -1 + + +--- BIT SHIFT LEFT ON POSITIVE INTEGERS --- +Expression: 8 = 4 << 1 + Decimal: + val=4 + res=8 + Binary: + val=0000000000000000000000000000000000000000000000000000000000000100 + res=0000000000000000000000000000000000000000000000000000000000001000 + NOTE: zeros fill in right side + +Expression: 4611686018427387904 = 4 << 60 + Decimal: + val=4 + res=4611686018427387904 + Binary: + val=0000000000000000000000000000000000000000000000000000000000000100 + res=0100000000000000000000000000000000000000000000000000000000000000 + +Expression: -9223372036854775808 = 4 << 61 + Decimal: + val=4 + res=-9223372036854775808 + Binary: + val=0000000000000000000000000000000000000000000000000000000000000100 + res=1000000000000000000000000000000000000000000000000000000000000000 + NOTE: sign bits get shifted out + +Expression: 0 = 4 << 62 + Decimal: + val=4 + res=0 + Binary: + val=0000000000000000000000000000000000000000000000000000000000000100 + res=0000000000000000000000000000000000000000000000000000000000000000 + NOTE: bits shift out left side + + +--- BIT SHIFT LEFT ON NEGATIVE INTEGERS --- +Expression: -8 = -4 << 1 + Decimal: + val=-4 + res=-8 + Binary: + val=1111111111111111111111111111111111111111111111111111111111111100 + res=1111111111111111111111111111111111111111111111111111111111111000 + NOTE: zeros fill in right side + +Expression: -9223372036854775808 = -4 << 61 + Decimal: + val=-4 + res=-9223372036854775808 + Binary: + val=1111111111111111111111111111111111111111111111111111111111111100 + res=1000000000000000000000000000000000000000000000000000000000000000 + +Expression: 0 = -4 << 62 + Decimal: + val=-4 + res=0 + Binary: + val=1111111111111111111111111111111111111111111111111111111111111100 + res=0000000000000000000000000000000000000000000000000000000000000000 + NOTE: bits shift out left side, including sign bit +]]> + + + + + + 使用 gmp 扩展对超出 PHP_INT_MAX 的数值来进行位操作。 + + + + + &reftitle.seealso; + + + + pack + unpack + gmp_and + gmp_or + gmp_xor + gmp_testbit + gmp_clrbit + + + +
diff --git a/language/operators/comparison.xml b/language/operators/comparison.xml new file mode 100644 index 0000000000..4223461e82 --- /dev/null +++ b/language/operators/comparison.xml @@ -0,0 +1,505 @@ + + + + 比较运算符 + + 比较运算符,如同它们名称所暗示的,允许对两个值进行比较。还可以参考 + PHP 类型比较表看不同类型相互比较的例子。 + + + 比较运算符 + + + + 例子 + 名称 + 结果 + + + + + $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的 int 值。 + + + + +
+ + 当两个操作对象都是 + 数字字符串, + 或一个是数字另一个是 + 数字字符串, + 就会自动按照数值进行比较。 + 此规则也适用于 + switch 语句。 + 当比较时用的是 ===!==, + 则不会进行类型转换——因为不仅要对比数值,还要对比类型。 + + + + PHP 8.0.0 之前,如果 string 与数字或者数字字符串进行比较, + 则在比较前会将 string 转化为数字。 + 在如下示例中会出现不可预料的结果: + + + +]]> + + &example.outputs.7; + + + + &example.outputs.8; + + + + + + + + + + + 1; // 0 +echo 1 <=> 2; // -1 +echo 2 <=> 1; // 1 + +// 浮点数 +echo 1.5 <=> 1.5; // 0 +echo 1.5 <=> 2.5; // -1 +echo 2.5 <=> 1.5; // 1 + +// 字符串 +echo "a" <=> "a"; // 0 +echo "a" <=> "b"; // -1 +echo "b" <=> "a"; // 1 + +echo "a" <=> "aa"; // -1 +echo "zz" <=> "aa"; // 1 + +// 数组 +echo [] <=> []; // 0 +echo [1, 2, 3] <=> [1, 2, 3]; // 0 +echo [1, 2, 3] <=> []; // 1 +echo [1, 2, 3] <=> [1, 2, 1]; // 1 +echo [1, 2, 3] <=> [1, 2, 4]; // -1 + +// 对象 +$a = (object) ["a" => "b"]; +$b = (object) ["a" => "b"]; +echo $a <=> $b; // 0 + +$a = (object) ["a" => "b"]; +$b = (object) ["a" => "c"]; +echo $a <=> $b; // -1 + +$a = (object) ["a" => "c"]; +$b = (object) ["a" => "b"]; +echo $a <=> $b; // 1 + +// 不仅仅比较值,而且也会匹配键 +$a = (object) ["a" => "b"]; +$b = (object) ["b" => "b"]; +echo $a <=> $b; // 1 + +?> +]]> + + + + + + + 对于多种类型,比较运算符根据下表比较(按顺序)。 + + + 比较多种类型 + + + + 运算数 1 类型 + 运算数 2 类型 + 结果 + + + + + nullstring + string + 将 &null; 转换为 "",进行数字或词汇比较 + + + boolnull + 任何其它类型 + 转换为 bool,&false; < &true; + + + object + object + + 内置类可以定义自己的比较,不同类不能比较,相同的类查看对象比较 + + + + stringresourceintfloat + stringresourceintfloat + 将字符串和资源转换成数字,按普通数学比较 + + + array + array + + 成员越少的数组越小,如果运算数 1 中的键不存在于运算数 + 2 中则数组无法比较,否则挨个值比较(见下例) + + + + object + 任何其它类型 + object 总是更大 + + + array + 任何其它类型 + array 总是更大 + + + +
+ + + + Boolean/null comparison + + +]]> + + + + + + + 标准数组比较代码 + + count($op2)) { + return 1; // $op1 > $op2 + } + foreach ($op1 as $key => $val) { + if (!array_key_exists($key, $op2)) { + return 1; + } elseif ($val < $op2[$key]) { + return -1; + } elseif ($val > $op2[$key]) { + return 1; + } + } + return 0; // $op1 == $op2 +} +?> +]]> + + + + + + 比较浮点数 + + + 由于浮点数 float 的内部表达方式,不应比较两个浮点数float是否相等。 + + + + 更多信息参见 float。 + + + + + + 请注意,在比较不同类型的值时,类型转换并不总是很明显,尤其是比较 &integer; 与 &boolean; 或者 + &integer; 与 &string;。因此,在大多数情况下,通常建议使用 === 和 + !== 进行比较而不是 ==!=。 + + + + + 不能比较的值 + + 虽然恒等比较(=== 和 + !==)可以应用于任意值,其它比较运算符应该仅用于可比较的值。不能比较的值的比较的结果是不确定的,不应依赖。 + + + + + &reftitle.seealso; + + + strcasecmp + strcmp + 数组运算符 + 类型 + + + + + + 三元运算符 + + 另一个条件运算符是“?:”(或三元)运算符 。 + + 赋默认值 + + +]]> + + + 表达式 (expr1) ? (expr2) : (expr3) 在 + expr1 求值为 &true; + 时的值为 expr2,在 + expr1 求值为 &false; 时的值为 + expr3。 + + + 可以省略三元运算符中间那部分。表达式 + expr1 ?: expr3 等同于如果 + expr1 求值为 &true; 时返回 + expr1 的结果,否则返回 + expr3expr1 在这里仅执行一次。 + + + + 注意三元运算符是个语句,因此其求值不是变量,而是语句的结果。如果想通过引用返回一个变量这点就很重要。在一个通过引用返回的函数中语句 + return $var == 42 ? $a : $b; 将不起作用,以后的 PHP + 版本会为此发出一条警告。 + + + + + 建议避免将三元运算符堆积在一起使用。和其他语言相比, + 当在单个表达式中使用多个未加括号的三元运算符时会造成 + PHP 运算结果不清晰。 + 甚至在 PHP 8.0.0 之前,三元运算符是从左到右执行的, + 而大多数其他编程语言是从右到左的。 + 自 PHP 7.4.0 起,弃用依靠左联。 + PHP 8.0.0 起,三元运算符是非关联的。 + + 不清晰的三元运算符行为 + + +]]> + + + + + + + 然而,短三元运算符(?:)的链接是稳定且合理的。他将第一个参数进行求值,结果为非假值。注意,未定义的值将会引发警告。 + + Short-ternary chaining + + +]]> + + + + + + + + NULL 合并运算符 + + 另一个简略运算符是 "??" (NULL 合并)运算符。 + + 设置默认值 + + +]]> + + + 当 expr1 为 &null;,表达式 (expr1) ?? (expr2) 等同于 + expr2,否则为 expr1。 + + + 尤其要注意,当不存在左侧的值时,此运算符也和 isset 一样不会产生警告。 + 对于 array 键尤其有用。 + + + + 请注意:NULL 合并运算符是一个表达式,产生的也是表达式结果,而不是变量。 + 返回引用变量时需要强调这一点。 + 因此,在返回引用的函数里就无法使用这样的语句:return $foo ?? $bar;,还会提示警告。 + + + + + null 合并运算符的优先级较低。这意味着如果将它与其它运算符(比如字符串链接或者算术运算符)混合使用,可能需要括号。 + + + +]]> + + + + + 请注意,NULL 合并运算符支持简单的嵌套: + + 嵌套 NULL 合并运算符 + + +]]> + + + + + +
diff --git a/language/operators/errorcontrol.xml b/language/operators/errorcontrol.xml new file mode 100644 index 0000000000..2a6cb2e52f --- /dev/null +++ b/language/operators/errorcontrol.xml @@ -0,0 +1,68 @@ + + + + 错误控制运算符 + + PHP 支持一个错误控制运算符:@。当将其放置在一个 PHP + 表达式之前,该表达式可能产生的任何错误诊断都被抑制。 + + + 如果用 set_error_handler + 设定了自定义的错误处理函数,即使诊断信息被抑制,也仍然会被调用。 + + + + + PHP 8.0.0 之前,如果错误被 @ 运算符抑制,则在自定义错误处理程序中调用 error_reporting 将始终返回 + 0。PHP 8.0.0 起,返回值为 E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE。 + + + + + error_get_last 返回数组中的 "message" 元素储存了表达式产生的任意错误信息。 + 此函数的返回结果会随着每次错误的发生而相应变化,所以需要尽早检查。 + + + + + +]]> + + + + + + @ 运算符只对 表达式 有效。 + 对新手来说一个简单的规则就是:如果能从某处获得值,就能在它前面加上 + @ 运算符。例如,可以把它放在变量,函数调用,某些语言构造调用(例如 include )等等之前。 + 不能把它放在函数或类的定义之前,也不能用于条件结构例如 if 和 &foreach; 等。 + + + + + PHP 8.0.0 之前,@ 运算符会禁用导致脚本停止运行的严重错误。 + 例如在调用一个不存在的函数前添加 @,由于函数不可用或者输入错误, + 将会导致脚本终止,而不会说明原因。 + + + + + &reftitle.seealso; + + + error_reporting + 错误处理与日志记录函数 + + + + diff --git a/language/operators/execution.xml b/language/operators/execution.xml new file mode 100644 index 0000000000..2e3e8f3e12 --- /dev/null +++ b/language/operators/execution.xml @@ -0,0 +1,42 @@ + + + + 执行运算符 + + PHP 支持一个执行运算符:反引号(``)。注意这不是单引号!PHP + 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“`”的效果与函数 + shell_exec 相同。 + + +$output"; +?> +]]> + + + + + + 关闭了 shell_exec 时反引号运算符是无效的。 + + + + + 与其它某些语言不同,反引号不能在双引号字符串中使用。 + + + + + &reftitle.seealso; + + + 程序执行函数 + popen + proc_open + PHP 的命令行模式 + + + + diff --git a/language/operators/increment.xml b/language/operators/increment.xml new file mode 100644 index 0000000000..ca090869e6 --- /dev/null +++ b/language/operators/increment.xml @@ -0,0 +1,139 @@ + + + + 递增/递减运算符 + + PHP 支持 C 风格的前/后递增与递减运算符。 + + + + 递增/递减运算符不影响布尔值。递减 + &null; 值也没有效果,但是递增 &null; 的结果是 1。 + + + + 递增/递减运算符 + + + + 例子 + 名称 + 效果 + + + + + ++$a + 前加 + $a 的值加一,然后返回 $a + + + $a++ + 后加 + 返回 $a,然后将 $a 的值加一。 + + + --$a + 前减 + $a 的值减一, 然后返回 $a + + + $a-- + 后减 + 返回 $a,然后将 $a 的值减一。 + + + +
+ + 一个简单的示例脚本: + + +Postincrement"; +$a = 5; +echo "Should be 5: " . $a++ . "
\n"; +echo "Should be 6: " . $a . "
\n"; + +echo "

Preincrement

"; +$a = 5; +echo "Should be 6: " . ++$a . "
\n"; +echo "Should be 6: " . $a . "
\n"; + +echo "

Postdecrement

"; +$a = 5; +echo "Should be 5: " . $a-- . "
\n"; +echo "Should be 4: " . $a . "
\n"; + +echo "

Predecrement

"; +$a = 5; +echo "Should be 4: " . --$a . "
\n"; +echo "Should be 4: " . $a . "
\n"; +?> +]]> +
+
+
+ + 在处理字符变量的算数运算时,PHP 沿袭了 Perl 的习惯,而非 C 的。例如,在 + Perl 中 $a = 'Z'; $a++; 将把 $a + 变成'AA',而在 C 中,a = 'Z'; a++; 将把 + a 变成 '[''Z' + 的 ASCII 值是 90,'[' 的 ASCII 值是 + 91)。注意字符变量只能递增,不能递减,并且只支持纯 ASCII 字母数字(a-z、A-Z 和 + 0-9)。递增/递减其他字符变量则无效,原字符串没有变化。 + + 涉及字符变量的算数运算 + + +]]> + + &example.outputs; + + + + + + + 递增或递减布尔值没有效果。 + +
diff --git a/language/operators/logical.xml b/language/operators/logical.xml new file mode 100644 index 0000000000..44c1e9eb80 --- /dev/null +++ b/language/operators/logical.xml @@ -0,0 +1,105 @@ + + + + 逻辑运算符 + + + 逻辑运算符 + + + + 例子 + 名称 + 结果 + + + + + $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;。 + + + +
+ + “与”和“或”有两种不同形式运算符的原因是它们运算的优先级不同(见运算符优先级)。 + + + 逻辑运算符示例 + + +]]> + + &example.outputs.similar; + + + + +
diff --git a/language/operators/precedence.xml b/language/operators/precedence.xml new file mode 100644 index 0000000000..7d33a7317a --- /dev/null +++ b/language/operators/precedence.xml @@ -0,0 +1,391 @@ + + + + 运算符优先级 + + 运算符优先级指定了两个表达式绑定得有多“紧密”。例如,表达式 1 + 5 * + 3 的结果是 16 而不是 18 + 是因为乘号(“*”)的优先级比加号(“+”)高。必要时可以用括号来强制改变优先级。例如:(1 + + 5) * 3 的值为 18。 + + + 如果运算符优先级相同,那运算符的结合方向决定了该如何运算。例如,"-"是左联的,那么 1 - 2 - 3 就等同于 (1 - 2) - 3 + 并且结果是 -4. 另外一方面,"="是右联的,所以 $a = $b = $c 等同于 + $a = ($b = $c)。 + + + 没有结合的相同优先级的运算符不能连在一起使用,例如 + 1 < 2 > 1 在PHP是不合法的。但另外一方面表达式 + 1 <= 1 == 1 是合法的, 因为 == 的优先级低于 + <=。 + + + 关联性仅对二(三)元操作符有意义。 + 一元操作符是前缀或者后缀,所以不适用该概念。 + 例如 !!$a 仅可分为 !(!$a)。 + + + 括号的使用,哪怕在不是必要的场合下,通过括号的配对来明确标明运算顺序,而非靠运算符优先级和结合性来决定,通常能够增加代码的可读性。 + + + 下表按照优先级从高到低列出了运算符。同一行中的运算符具有相同优先级,此时它们的结合方向决定求值顺序。 + + 运算符优先级 + + + + 结合方向 + 运算符 + 附加信息 + + + + + 不适用 + + clone + new + + clone 和 new + + + + ** + 算术运算符 + + + 不适用 + + + + - + ++ + -- + ~ + (int) + (float) + (string) + (array) + (object) + (bool) + @ + + + 算术 (一元 +-), + 递增/递减, + 按位, + 类型转换&listendand; + 错误控制 + + + + + instanceof + + 类型 + + + + 不适用 + ! + + 逻辑运算符 + + + + + + * + / + % + + + 算术运算符 + + + + + + + + - + . + + + 算数 (二元 +-), + array&listendand; + string (. PHP 8.0.0 前可用) + + + + + + << + >> + + + 位运算符 + + + + + . + + string (PHP 8.0.0 起可用) + + + + + + < + <= + > + >= + + + 比较运算符 + + + + + + == + != + === + !== + <> + <=> + + + 比较运算符 + + + + + & + + 位运算符&listendand;引用 + + + + ^ + + 位运算符 + + + + + | + + 位运算符 + + + + + && + + 逻辑运算符 + + + + + || + + 逻辑运算符 + + + + + ?? + + null 合并运算符 + + + + 无关联 + ? : + + 三元运算符 + (PHP 8.0.0 之前左联) + + + + + + = + += + -= + *= + **= + /= + .= + %= + &= + |= + ^= + <<= + >>= + ??= + + + 赋值运算符 + + + + 不适用 + yield from + + yield from + + + + 不适用 + yield + + yield + + + + 不适用 + print + print + + + + and + + 逻辑运算符 + + + + + xor + + 逻辑运算符 + + + + + or + + 逻辑运算符 + + + + +
+
+ + + 结合方向 + + $a = 5, $b = 5 +?> +]]> + + + + + 运算符优先级和关联方式仅决定表达式如何分组,不指定计算顺序。 + 一般情况下, PHP 不指定表达式的计算顺序,并且代码避免指定假设执行顺序, + 因为行为会在 PHP 版本间发生变化或者依赖于旁边的代码。 + + 未定义执行顺序 + + +]]> + + + + <literal>+</literal>、<literal>-</literal> 、<literal>.</literal> 具有相同的优先级 + + +]]> + + &example.outputs; + + + + + + + + 尽管 = 比其它大多数的运算符的优先级低,PHP + 仍旧允许类似如下的表达式:if (!$a = foo()),在此例中 + foo() 的返回值被赋给了 $a。 + + + + &reftitle.changelog; + + + + + &Version; + &Description; + + + + + 8.0.0 + + 现在,字符串连接符(.)的优先级比算数加/减(+ 和 + -)、按位左/右移(<< 和 + >>)更低。在此之前,它的优先级与 +、 + - 相同,并且比 <<、 + >> 更高。 + + + + 8.0.0 + + 三元运算符(? :)是现在是非关联的;以前它是左联的。 + + + + 7.4.0 + + 已弃用在无括号的表达式中依赖字符串连接(.)相对于算数加/减(+ 或者 + -)或者按位左/右移(<< 或者 + >>)的优先级的使用方法。 + + + + 7.4.0 + + 不推荐使用三元运算符(? :)的左联。 + 即已弃用嵌套多个未带括号的三元运算符。 + + + + + + +
\ No newline at end of file diff --git a/language/operators/string.xml b/language/operators/string.xml new file mode 100644 index 0000000000..c66c5ad714 --- /dev/null +++ b/language/operators/string.xml @@ -0,0 +1,35 @@ + + + + 字符串运算符 + + 有两个字符串(string)运算符。第一个是连接运算符(“.”),它返回其左右参数连接后的字符串。第二个是连接赋值运算符(“.=”),它将右边参数附加到左边的参数之后。更多信息见赋值运算符。 + + + + + + +]]> + + + + + + &reftitle.seealso; + + + 字符串类型 + 字符串函数 + + + + diff --git a/language/operators/type.xml b/language/operators/type.xml new file mode 100644 index 0000000000..92e815a284 --- /dev/null +++ b/language/operators/type.xml @@ -0,0 +1,260 @@ + + + + 类型运算符 + + instanceof 用于确定一个 PHP 变量是否属于某一类 + class 的实例: + + 对类使用 <literal>instanceof</literal> + + +]]> + + &example.outputs; + + + + + + + instanceof 也可用来确定一个变量是不是继承自某一父类的子类的实例: + + 对继承类使用 <literal>instanceof</literal> + + +]]> + + &example.outputs; + + + + + + + 检查一个对象是否不是某个类的实例,可以使用逻辑运算符 not。 + + 使用 <literal>instanceof</literal> 检查对象<emphasis>不是</emphasis>某个类的实例 + + +]]> + + &example.outputs; + + + + + + + 最后,instanceof也可用于确定一个变量是不是实现了某个接口的对象的实例: + + 对接口使用 <literal>instanceof</literal> + + +]]> + + &example.outputs; + + + + + + + 虽然 instanceof 通常直接与类名一起使用,但也可以使用对象或字符串变量: + + 对其它变量使用 <literal>instanceof</literal> + + +]]> + + &example.outputs; + + + + + + + 如果被检测的变量不是对象,instanceof 并不发出任何错误信息而是返回 + &false;。PHP 7.3.0 之前不允许用于检测常量。 + + 用 <literal>instanceof</literal> 检测其它变量 + + +]]> + + &example.outputs; + + + + + + PHP 7.3.0 起, + instanceof 操作符的左侧可以放常量。 + + 使用 <literal>instanceof</literal> 测试常量 + + +]]> + + &example.outputs.73; + + + + + + + PHP 8.0.0 起, instanceof 可以与任何表达式一起使用。表达式必须使用括号括起来并且生成 + string。 + + + 将 <literal>instanceof</literal> 与任意表达式一起使用 + + +]]> + + &example.outputs.8; + + + + + + + instanceof 在功能上有个 + 类似的变体 is_a。 + + + + &reftitle.seealso; + + + get_class + is_a + + + +