PHP“&”运算符
我不是一个PHP程序员(但知道其他语言),并且我试图了解一个在PHP(5.1.6)中完成的网页,以便做一些更改。
该页面具有以下代码(简化):
$db_hosts = array();
$sql = 'SELECT h.hostid, h.host FROM hosts h ';
$db_items = DBselect($sql);
while($db_item = DBfetch($db_items)){
$name = $db_item['host'];
$db_host = &$db_hosts[$db_item['hostid']];
}
我试图理解最后一行, $db_host = &$db_hosts[$db_item['hostid']];
。
它似乎在创建一个新变量$db_host
,并在其中添加了一些内容,但我不明白&$db_hosts
。
我怀疑,因为据我所知, $db_hosts
是一个空数组。
我发现这个和这个,但我不太确定,因为在这些链接中,运算符是“=&”,并且在代码中,运算符被附加到变量“=&$ db_hosts”(它有一个空格介于=和&)之间。
由于我试图修改它并没有取得成功,我认为最好是寻求帮助......
这些是引用,它们类似于C或C ++中的“指针”。
更多信息在PHP手册中。
在这种情况下,由于$db_hosts
为空,构造函数$db_hosts[$db_item['hostid']]
将在$db_item['hostid']
的索引处创建一个空项目的新数组,并返回项目的引用, $db_host
作为任何$db_hosts[$db_item['hostid']]
当前的'别名'。
&
在PHP中用于表示引用(参见本手册部分),但将它视为自己的操作符是误导性的。 这就是为什么有些人喜欢写$foo =& $bar
而不是$foo = &$bar
- 这意味着同样的事情,但强调“reference-y-ness”是赋值的属性,而不是变量。
在一些编程语言中,比如C或者C ++,你可以“获得对某个特定变量的引用; 结果值可以作为不同的实体传递,然后“解除引用”以找出它指向的位置。 这不是 PHP引用的内容。
相反,所有PHP变量实际上都是对称为zval
的内部类型的引用。 您不能直接在PHP中操作zval
,也不能在其中添加额外的间接层 - 每个变量都是对zval
的引用,就是这样。 (请参阅下面的警告:对象。)
什么是引用分配( $foo =& $bar
),传递引用( function foo(&$bar) { ... }
)还是引用return &$foo
( return &$foo
)做的是告诉PHP你想让两个变量指向相同的zval
。 请注意,你并没有将一个变量指向另一个变量 - 它们都是同样“真实的”,而调用unset()
会使另一个完全不变。
警告:物体
常常误导性地说,由于PHP5对象“总是通过引用传递”。 事实是它们有一个额外的间接层,其中zval
本身就是一个指向特定对象的指针。 这给了我们三个不同的东西,我们可以引用:变量,它指向的zval
以及指向的对象:
// Create an object, and point three variables at it in different ways:
$foo = new stdClass;
$bar_by_value = $foo;
$bar_by_ref =& $foo;
// Change the object: updates the object shared by all three variables
$foo->value = 42;
// Change the value (zval) of $foo: will update $bar_by_ref,
// but $bar_by_value still points at the original object
$foo = 42;
// Change the variable itself: will never affect $bar_by_value or $bar_by_ref
unset($foo);
问题 :
PHP中的“&”是什么意思?
PHP“&”运算符
一旦我们习惯了,让生活变得更加轻松。(仔细查看下面的例子)
&通常会检查在$ a和$ b中设置的位。
你甚至注意到这些电话是如何工作的吗?
error_reporting(E_ERROR | E_WARNING | E_PARSE);
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
error_reporting(E_ALL & ~E_NOTICE);
error_reporting(E_ALL);
所以上面的是比特运算符和比特的比赛。
其中一个有用的例子就是像下面给出的简单配置,所以单个整数字段可以为您存储数千个连击。
大多数人已经阅读过文档,但没有真正了解这些按位运算符的真实世界用例。
示例这可以是每天php生活中非常有用的
<?php
class Config {
// our constants must be 1,2,4,8,16,32,64 ....so on
const TYPE_CAT=1;
const TYPE_DOG=2;
const TYPE_LION=4;
const TYPE_RAT=8;
const TYPE_BIRD=16;
const TYPE_ALL=31;
private $config;
public function __construct($config){
$this->config=$config;
if($this->is(Config::TYPE_CAT)){
echo 'cat ';
}
if($this->is(Config::TYPE_DOG)){
echo 'dog ';
}
if($this->is(Config::TYPE_RAT)){
echo 'rat ';
}
if($this->is(Config::TYPE_LION)){
echo 'lion ';
}
if($this->is(Config::TYPE_BIRD)){
echo 'bird ';
}
echo "n";
}
private function is($value){
return $this->config & $value;
}
}
new Config(Config::TYPE_ALL);
// cat dog rat lion bird
new Config(Config::TYPE_BIRD);
//bird
new Config(Config::TYPE_BIRD | Config::TYPE_DOG);
//dog bird
new Config(Config::TYPE_ALL & ~Config::TYPE_DOG & ~Config::TYPE_CAT);
//rat lion bird
链接地址: http://www.djcxy.com/p/1689.html
上一篇: PHP "&" operator