1.4PHP语言的运算符(Operator)和非运算符(Non-Operator)

1.一元运算符

运算符名称描述
+$a取正根据情况将 $a 转化为 int 或 float。
-$a取反$a 的负值。
++$a前递增$a 的值加 1,然后返回 $a
--$a前递减$a 的值减 1, 然后返回 $a
$a++后递增返回 $a,然后将 $a 的值加 1。
$a--后递减返回 $a,然后将 $a 的值减 1。

2.算术运算符

运算符名称描述
$a + $b加法$a 和 $b 的和。
$a - $b减法$a 和 $b 的差。
$a * $b乘法$a 和 $b 的积。
$a / $b除法$a 除以 $b 的商。
$a % $b取模$a 除以 $b 的余数。
$a ** $b求幂$a 的 $b次方的值。

3.赋值运算符

运算符名称等同于
$a = $b赋值——————
$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 ??= $bNULL 合并赋值$a = $a ?? $b

4.相等性运算符

当使用相等运算符(==)时,如果两个对象是同一类的实例,且具有相同的属性和值(值使用 == 进行比较),则它们是相等的。

当使用全等运算符(===)时,如果两个对象都引用同一类的同一个实例,则它们是全等的。

运算符名称描述
$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.关系比较运算符

运算符名称描述
$a < $b小于如果 $a 严格小于 $b,则返回 true。
$a <= $b小于等于如果 $a 小于或者等于 $b,则返回 true。
$a > $b大于如果 $a 严格大于 $b,则返回 true。
$a >= $b大于等于如果 $a 大于或者等于 $b,则返回 true。
$a <=> $b太空船运算符(组合比较运算符)$a 小于、等于、大于 $b 时,则分别返回一个小于、等于、大于 0 的 int 值。

6.布尔逻辑运算符

运算符名称描述
!表达式逻辑非(not)如果表达式的计算结果为“假”,则返回 true,否则返回 false
表达式1 && 表达式2逻辑与(and)如果左侧表达式1的计算结果为“假”,则不计算右侧表达式2并返回 false。如果左侧表达式1的计算结果为“真”,则继续计算右侧表达式2并返回右侧表达式2的返回值 truefalse
表达式1 || 表达式2逻辑或(or)如果左侧表达式1的计算结果为“真”,则不计算右侧表达式2并返回 true。如果左侧表达式1的计算结果为“假”,则继续计算右侧表达式2并返回右侧表达式2的返回值 truefalse
表达式1 and 表达式2and运算符&& 运算符的低优先级版本,之所以使用 and 运算符,是因为它的名字是英文单词,更易于阅读。
表达式1 or 表达式2or运算符|| 运算符的低优先级版本,之所以使用 or 运算符,是因为它的名字是英文单词,更易于阅读。
表达式1 xor 表达式2xor(逻辑异或)运算符如果左侧表达式1 或 右侧表达式2 任一计算结果为“真”,但不同时是,则返回 true,否则返回 false

7.位运算符

运算符名称描述
~ $aNot(按位取反)将 $a 中为 0 的位设为 1,反之亦然。
$a & $bAnd(按位与)将把 $a 和 $b 中都为 1 的位设为 1。
$a | $bOr(按位或)将把 $a 和 $b 中任何一个为 1 的位设为 1。
$a ^ $bXor(按位异或)将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。
$a << $bShift left(左移位)将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。
$a >> $bShift right(右移位)将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。

8.三元条件运算符

运算符描述
(expr1) ? (expr2) : (expr3)在 expr1 求值为 true 时,整个表达式的值为 expr2,在 expr1 求值为 false 时,整个表达式的值为 expr3。
expr1 ?: expr3在 expr1 求值为 true 时,整个表达式的值为 expr1,在 expr1 求值为 false 时,整个表达式的值为 expr3。

9.字符串连接运算符

运算符名称等同于
$a . $b字符串连接运算符——————
$a .= $b字符串连接赋值运算符$a = $a . $b

10.Null运算符

运算符名称描述
(expr1) ?? (expr2)Null合并运算符当 expr1 为 null,整个表达式的值为 expr2,否则为 expr1。
(expr1)?->(expr2)?->(expr3)Null安全运算符从左往右依次计算,如果 ?-> 左侧的表达式为 null,则整个表达式立即停止计算并返回 null,否则往右继续计算,以此类推。
$result = $repository?->getUser(5)?->name;

//上边那行代码等价于以下代码
if (is_null($repository)) {
    $result = null;
} else {
    $user = $repository->getUser(5);
    if (is_null($user)) {
        $result = null;
    } else {
        $result = $user->name;
    }
}

11.数组运算符

运算符名称描述
$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。

12.类型运算符

运算符名称描述
instanceof类型运算符用于确定一个 PHP 变量是否是某一个类的实例。

13.执行(Execution)运算符

运算符名称描述
反引号``执行(Execution)运算符PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回。使用反引号`
`的效果与函数 shell_exec() 相同。
$output = `ls -al`;
echo "<pre>$output</pre>";

14.错误控制(Error Control)运算符

运算符名称描述
@expr错误控制(Error Control)运算符当将 @ 放置在一个 PHP 表达式之前,该表达式可能产生的任何错误诊断都被抑制。

15.范围解析(Scope Resolution)运算符

运算符名称描述
::范围解析(Scope Resolution)运算符,又称为 Paamayim Nekudotayim(希伯来语:双冒号的意思) 或 双冒号。用于访问静态属性、静态方法、类常量,还可以用于访问父类中已覆盖的实例方法、构造函数、析构函数、魔术方法。

16.非运算符

非运算符名称描述
空白符空白符空格符、水平制表符、垂直制表符、换行符、换页符、回车符等。
;分号指令分隔符(Instruction Separation)
...省略号用于变量赋值和方法参数。

16.1...扩展(spread)运算符

16.1.1用于变量赋值

暂不支持用于数组解构(destructuring)赋值,支持用于数组解包(unpacking)赋值。

数组解包(unpacking)赋值用于把已存在的 数组(或实现了 Traversable 接口的类的对象) 中的元素解包复制到新的 数组(实现了 Traversable 接口的类的对象) 中。支持 array() 语言结构创建方式 和 [] 字面量创建方式的数组。

…索引数组

//新数组中的元素全部由老数组中的元素组成。
$arr1 = [1, 2, 3];

//解包一次
$arr2 = [...$arr1];  // [1, 2, 3]
//解包多次(两个$arr1)
$arr3 = [...$arr1, ...$arr1];  // [1, 2, 3, 1, 2, 3]
//新数组中的部分元素由老数组中的元素组成。
$arr1 = [1, 2, 3];

//新老数组无重复元素
//解包一次
$arr4 = [0, ...$arr1];  // [0, 1, 2, 3]
//解包多次(一个$arr1,另一个$arr2)
$arr5 = [...$arr1, ...$arr2, 111];  // [1, 2, 3, 1, 2, 3, 111]

//新老数组有重复元素,不会去重,仅此复制而已。
//解包一次
$arr6 = [1, ...$arr1];  // [1, 1, 2, 3]
//解包多次
$arr7 = [...$arr1, ...$arr2, 3];  // [1, 2, 3, 1, 2, 3, 3]
//等同于 [0 => 1, 1 => 2, 2 => 3]
$arr9 = [1, 2, 3];
//等同于 [0 => 4, 1 => 5, 2 => 6]
$arr10 = [4, 5, 6];
//[1, 2, 3, 4, 5, 6],等同于 [0 => 1, 1 => 2, 2 => 3, 3 => 4, 4 => 5, 5 => 6],老数组的索引没有被保存,而是新数组的索引会重新排序,所以不会出现覆盖。
$arr11 = [...$arr4, ...$arr5];

…关联数组

//无重复键
$arr1 = ["a" => 1];
$arr2 = ["b" => 2];
$arr3 = ["c" => 0, ...$arr1, ...$arr2];
var_dump($arr3);  // ["c" => 0, "a" => 1, "b" => 2]
//有重复键,那遵循关联数组的多个元素如果使用相同的键名,则只有最后一个元素会被使用,其它的元素都会被最后一个元素覆盖。
$arr1 = ["a" => 1];
$arr2 = ["a" => 2];
$arr3 = ["a" => 0, ...$arr1, ...$arr2];
var_dump($arr3);  // ["a" => 2]

…混合数组

$arr1 = [1, 2, 3];
$arr2 = ['a' => 4];
$arr3 = [...$arr1, ...$arr2];
var_dump($arr3);  // [1, 2, 3, "a" => 4]

…函数名()

//老数组作为函数的返回值
function getArr() {
  return ['a', 'b'];
}
$arr8 = [...getArr(), 'c' => 'd'];  // ['a', 'b', 'c' => 'd']

16.1.2用于方法参数

//用于剩余数组形参
function sum(...$numbers) {
    $acc = 0;
    foreach ($numbers as $n) {
        $acc += $n;
    }
    return $acc;
}

echo sum(1, 2, 3, 4);

//输出
10
//用于解包数组(或实现了Traversable接口的类的对象)为独立的实参,支持array()语言结构创建方式和[]字面量创建方式的数组。
function add($a, $b) {
    return $a + $b;
}

echo add(...[1, 2])."\n";

$a = [1, 2];
echo add(...$a);

//输出
3
3

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/php/phplang/28869.html

(0)
上一篇 2023年6月4日
下一篇 2023年6月5日

相关推荐

发表回复

登录后才能评论