PHP Conference Japan 2024

赋值运算符

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

赋值表达式的值是赋予的值。也就是说,“$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 条注释

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

我将执行时间从 5 秒减少到 0.5 秒(10 倍),只需简单地切换到第一个模式,该模式在一个循环中迭代 900 次,该循环遍历一个字符串 $text,该字符串最终达到 800K。
Robert Schneider
9 年前
注意带有条件语句的赋值。赋值运算符比“and”、“or”和“xor”优先级更高。

<?php
$x
= true and false; //$x 将为 true
$y = (true and false); //$y 将为 false
?>
Hayley Watson
17 年前
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;
?>
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