赋值运算符

基本的赋值运算符是 "="。你可能首先会认为它是 "等于" 的意思。别这么想。它实际上意味着左操作数被设置为右表达式的值(即 "被设置为")。

赋值表达式的值是赋值的值。也就是说,"$a = 3" 的值为 3。这允许你做一些很巧妙的事情

<?php

$a
= ($b = 4) + 5; // $a 现在等于 9,并且 $b 被设置为 4。

?>

除了基本的赋值运算符之外,对于所有 二元算术、数组合并和字符串运算符,都存在 "组合运算符",它们允许你使用表达式中的值,然后将该值设置为该表达式的结果。例如

<?php

$a
= 3;
$a += 5; // 将 $a 设置为 8,就像我们说 $a = $a + 5;
$b = "Hello ";
$b .= "There!"; // 将 $b 设置为 "Hello There!",就像 $b = $b . "There!";

?>

注意,赋值会将原始变量复制到新变量中(按值赋值),因此对其中一个变量的更改不会影响另一个变量。如果你需要在一个紧密的循环中复制一个大型数组,这可能也很重要。

在 PHP 中,按值赋值行为的一个例外发生在 对象 上,它们是按引用赋值的。可以使用 clone 关键字显式地复制对象。

按引用赋值

PHP 也支持按引用赋值,使用 "$var = &$othervar;" 语法。按引用赋值意味着两个变量最终指向相同的数据,并且没有任何内容被复制到任何地方。

示例 #1 按引用赋值

<?php
$a
= 3;
$b = &$a; // $b 是对 $a 的引用

print "$a\n"; // 打印 3
print "$b\n"; // 打印 3

$a = 4; // 更改 $a

print "$a\n"; // 打印 4
print "$b\n"; // 也会打印 4,因为 $b 是对 $a 的引用,而 $a 已经改变了
// 被更改
?>

new 运算符会自动返回一个引用,因此按引用赋值 new 的结果是一个错误。

<?php
class C {}

$o = &new C;
?>

上面的示例将输出

Parse error: syntax error, unexpected 'new' (T_NEW) in …

有关引用及其潜在用途的更多信息,请参阅手册的 引用解释 部分。

算术赋值运算符

示例 等效 操作
$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 空合并
添加注释

用户贡献的注释 4 注释

135
Peter, Moscow
13 年前
使用 $text .= "additional text"; 而不是 $text = $text ."additional text"; 可以由于内存分配效率而显著提高性能。

我通过简单地将一个包含 900 次迭代的循环切换到第一个模式,将执行时间从 5 秒减少到 0.5 秒(10 倍),其中字符串 $text 在循环结束时达到 800K。
59
Robert Schneider
9 年前
注意带有条件语句的赋值。赋值运算符比 'and'、'or' 和 'xor' 的优先级高。

<?php
$x
= true and false; //$x 将为 true
$y = (true and false); //$y 将为 false
?>
30
Hayley Watson
16 年前
bradlis7 at bradlis7 dot com 的描述有点令人困惑。以下是重述。

<?php
$a
= 'a';
$b = 'b';

$a .= $b .= "foo";

echo
$a,"\n",$b;?>
输出

abfoo
bfoo

因为赋值运算符是右结合的,并且计算结果为赋值的结果
<?php
$a
.= $b .= "foo";
?>
等效于
<?php
$a
.= ($b .= "foo");
?>
因此
<?php
$b
.= "foo";
$a .= $b;
?>
14
asc at putc dot de
9 年前
PHP 为组合赋值运算符使用临时变量(与 JavaScript 不同),因此左侧(目标)最后计算。

输入
$a += $b + $c;

含义
$a = ($b + $c) + $a;

不是
$a = $a + ($b + $c);

如果目标在表达式中被修改,这可能很重要。

$a = 0;
$a += (++$a) + (++$a); // 产生 5(而不是 4)
To Top