PHP中的“=&”和“&=”运算符是什么意思?

PHP中的“=&”/“&=”运算符是什么意思? 我在哪里可以阅读有关他们的信息?

search谷歌没有帮助。

$a &= $b$a = $a & $b简称,它是按位运算符。

$a =& $b$a =& $b分配给$ b的引用 。

=

$a =& $b$a变成$b的别名。 如果$a的值或引用被改变,则$b的值或引用将相应地改变。

这与“指向同一地点”的对象不同:我可以做$c = $d = new AnObject( ),并且这两个variables都指向相同的地方; 然而,改变其中一点的地方不会改变其他点的位置。 也就是说, $c = null不会使$d = null 。 在$a =& $b的情况下, $a = null会使$b = null

注意:正式地,别名实际上被称为引用。 官方术语有点用词不当,而且肯定含糊不清,所以我select用“别名”来代替。 有关文档,请参阅php.net 。

用途和效果

对于标量值, =&就像是将值包装在一个对象中,这样就可以在多个variables之间普遍地改变这个值。 对于通常通过引用(对象)传递的types, =&提供对引用的引用。

当我使用关联数组时,我倾向于使用=& 。 我可以创build一个别名: $foobar =& $foo['bar']['foobar']而不是重写$foo['bar']['foobar'] $foobar =& $foo['bar']['foobar'] 。 如果索引不存在,这些工具甚至可以工作。 如果$foo['bar']['foobar']不存在,则isset($foobar)将为false。 这比使用普通的旧variables要好,因为我可以在testing密钥的存在之前创build别名,而不会触发错误。

只要确保在完成时取消设置( unset($foobar) )别名即可。 否则,如果稍后重用variables名称,则最终将覆盖别名指向的任何内容。

您也可以以其他方式使用别名 – 他们不限于分配。 他们与:

  • foreach循环: foreach ($a as &$b)赋值给$b会覆盖$b中的对应值。 完成后请取消$b ,否则会遇到奇怪的问题!
  • 函数/方法参数: function foobar(&$a)foobar赋值给$a会改变调用者传递给$a任何variables。
  • 函数/方法返回值: function &foobar()无论返回什么,都可以被调用者修改; 这对于传递别名很有用。 这也很容易被滥用。
  • 数组: $a = array(&$b)$a[0]任何更改现在都会影响$b ,包括赋值。
  • call_user_func_array: call_user_func('foobar', array(&$a))假设foobar只有一个别名参数, foobar现在可以修改$a 。 这使您可以使用call_user_func_array调用具有别名参数的函数/方法。

例子

标量

 $original = 1; $copy = $original; $reference =& $original; // All three variables == 1. $reference = 2; // $original == 2, $reference == 2, $copy == 1 $original = 3; // $original == 3, $reference == 3, $copy == 1 $copy = 4; // $original == 3, $reference == 3, $copy == 4 

对象

 #!/usr/bin/env php <?php class Object { private $properties; public function __construct(array $properties = array()) { $this->properties = $properties; } public function __isset($key) { return isset($this->properties[$key]); } public function __unset($key) { unset($this->properties[$key]); } public function __get($key) { return isset($this->$key) ? $this->properties[$key] : null; } public function __set($key, $value) { $this->properties[$key] = $value; } public function __toString() { return print_r($this->properties, true); } } function print_vars() { global $original, $ref, $refref; echo '$original: ', $original, '$ref: ', $ref, '$refref: ', $refref, PHP_EOL; } $original = new Object(array('a' => 1, 'b' => 2, 'c' => 3)); $ref = $original; $refref =& $original; print_vars(); /* $original: Array ( [a] => 1 [b] => 2 [c] => 3 ) $ref: Array ( [a] => 1 [b] => 2 [c] => 3 ) $refref: Array ( [a] => 1 [b] => 2 [c] => 3 ) */ $original->a = 'duck'; $ref->b = 'moose'; $refref->c = 'cow'; print_vars(); /* $original: Array ( [a] => duck [b] => moose [c] => cow ) $ref: Array ( [a] => duck [b] => moose [c] => cow ) $refref: Array ( [a] => duck [b] => moose [c] => cow ) */ // This carries over to $refref, but not $ref. $original = new Object(array('x' => 1, 'y' => 2, 'z' => 3)); print_vars(); /* $original: Array ( [x] => 1 [y] => 2 [z] => 3 ) $ref: Array ( [a] => duck [b] => moose [c] => cow ) $refref: Array ( [x] => 1 [y] => 2 [z] => 3 ) */ // This does *not* carry over to $original or $ref. $ref = new Object(array('o' => 42, 'm' => 123, 'n' => 1337)); print_vars(); /* $original: Array ( [x] => 1 [y] => 2 [z] => 3 ) $ref: Array ( [o] => 42 [m] => 123 [n] => 1337 ) $refref: Array ( [x] => 1 [y] => 2 [z] => 3 ) */ // This *does* carry over to $original, but not $ref. $refref = new Object(array('alpha' => 10, 'beta' => 20, 'gamma' => 30)); print_vars(); /* $original: Array ( [alpha] => 10 [beta] => 20 [gamma] => 30 ) $ref: Array ( [o] => 42 [m] => 123 [n] => 1337 ) $refref: Array ( [alpha] => 10 [beta] => 20 [gamma] => 30 ) */ ?> 

&=

&=无关。 它来自一组赋值操作。 这只是一些:

  • +=
  • -=
  • *=
  • /=

看到这里的趋势?

二进制算术运算符通常具有对应的赋值。 假设@是一个算术运算符(它不是写作的),所以当$a$b是数字时, $a @ $b通常会产生一个数字。 (认为​​:加法,乘法,除法等)你需要多久做一次这样的事情?

 $a = $a @ $b; 

很经常。 重复$a似乎没有必要吗? 包括PHP在内的许多语言都使用一组赋值运算符来解决这个问题:

 $a @= $b; 

简单得多,对于习惯了这种表示法的程序员来说,一目了然可能更简洁明了。 (我当然觉得更容易阅读,因为我习惯了。)所以要加倍variables:

 $a *= 2; 

快速,简单,相对描述性强。 包括PHP在内的一些语言将这一function扩展到算术运算以外,还有一两个额外的操作。 值得注意的是:

 $a = $a . 'Appended text'; // Is the same as: $a .= 'Appended text'; 

很有用。

&=落在这些赋值运算符之间,因为&表示按位运算和运算 。 PHP文档中列出了一些其他的(见前面提到的链接),所有这些都是很多编程语言的共同之处。

这意味着$a &= $b$a = $a & $b