“=&”是什么PHP中的/“& =”运算符是什么意思?我在哪里可以阅读有关它们的信息?
搜索Google无济于事。
答案 0 :(得分:88)
$a &= $b
是$a = $a & $b
运营商$a =& $b
的缩写。
{{1}}将$ a作为bitwise-and分配给$ b。
答案 1 :(得分:36)
$a =& $b
将$a
变为$b
的别名。如果更改$a
的值或引用,$b
的值或引用将相应更改。
这与对象的“指向同一个地方”不同:我可以做$c = $d = new AnObject(
),两个变量都指向同一个地方;但是,改变其中一个点不会改变的位置。也就是说,$c = null
不会$d = null
。但是,在$a =& $b
的情况下,$a = null
会生成$b = null
。
注意:正式地说,别名实际上称为引用。官方术语有点用词不当,当然含糊不清,所以我选择使用“别名”一词。有关文档,请参阅php.net。
使用标量值,=&
有点像将值包装在对象中,因此您可以在多个变量中普遍更改值。对于通常由引用(对象)传递的类型,=&
提供对引用的引用。
当我使用关联数组时,我倾向于使用=&
。我可以创建一个别名:$foo['bar']['foobar']
,而不是多次重写$foobar =& $foo['bar']['foobar']
。如果索引尚不存在,这些甚至可以工作。如果$foo['bar']['foobar']
不存在,则isset($foobar)
将为false。它比使用普通的旧变量更好,因为我可以在测试密钥的存在之前创建别名,而不会触发错误。
完成后,请务必取消设置(unset($foobar)
)别名。否则,如果您稍后重复使用变量名称,则最终将覆盖别名指向的任何内容。
您也可以通过其他方式使用别名 - 它们不仅限于分配。他们合作:
foreach ($a as &$b)
分配到$b
将覆盖$a
中的相应值。完成后取消$b
,或者你会遇到奇怪的问题!function foobar(&$a)
在$a
内分配给foobar
会改变调用者传递的任何变量$a
。function &foobar()
返回的任何内容都可以被调用者修改;这对于传递别名很有用。它也容易被滥用。$a = array(&$b)
$a[0]
的所有更改现在都会影响$b
,包括作业。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;
更为简单,对于习惯于这种符号的程序员来说,或许更加简洁和描述一目了然。 (我当然觉得它更容易阅读,因为我已经习惯了。)所以要加倍变量:
$a *= 2;
快速,简单且相对具有描述性。某些语言(包括PHP)将此功能扩展到算术以外的一两个额外操作。值得注意的是:
$a = $a . 'Appended text';
// Is the same as:
$a .= 'Appended text';
非常有用。
&=
属于这些赋值运算符,因为&
代表bitwise arithmetic AND operation。 PHP文档中列出了一些其他内容(参见上述链接),所有这些都是许多编程语言所共有的。
这意味着$a &= $b
与$a = $a & $b
相同。