使用 $text .= "additional text"; 而不是 $text = $text ."additional text"; 可以由于内存分配效率而显著提高性能。
我通过简单地将一个包含 900 次迭代的循环切换到第一个模式,将执行时间从 5 秒减少到 0.5 秒(10 倍),其中字符串 $text 在循环结束时达到 800K。
基本的赋值运算符是 "="。你可能首先会认为它是 "等于" 的意思。别这么想。它实际上意味着左操作数被设置为右表达式的值(即 "被设置为")。
赋值表达式的值是赋值的值。也就是说,"$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 | 空合并 |
使用 $text .= "additional text"; 而不是 $text = $text ."additional text"; 可以由于内存分配效率而显著提高性能。
我通过简单地将一个包含 900 次迭代的循环切换到第一个模式,将执行时间从 5 秒减少到 0.5 秒(10 倍),其中字符串 $text 在循环结束时达到 800K。
注意带有条件语句的赋值。赋值运算符比 'and'、'or' 和 'xor' 的优先级高。
<?php
$x = true and false; //$x 将为 true
$y = (true and false); //$y 将为 false
?>
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;
?>
PHP 为组合赋值运算符使用临时变量(与 JavaScript 不同),因此左侧(目标)最后计算。
输入
$a += $b + $c;
含义
$a = ($b + $c) + $a;
不是
$a = $a + ($b + $c);
如果目标在表达式中被修改,这可能很重要。
$a = 0;
$a += (++$a) + (++$a); // 产生 5(而不是 4)