PHP “&” 运算符

php
2022-08-30 14:44:25

我不是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”(它在=和&之间有一个空格)。

由于我试图修改它并且没有成功,我认为寻求帮助更好......


答案 1

这些是引用,它们类似于C或C++中的“指针”。

更多信息请参阅 PHP 手册

在这种情况下,由于 为空,该构造将在 的索引上创建一个包含空项的新数组,并返回该项的引用,从而充当当前任何内容的“别名”。$db_hosts$db_hosts[$db_item['hostid']]$db_item['hostid']$db_host$db_hosts[$db_item['hostid']]


答案 2

&在 PHP 中,它以不同的方式用于表示引用(请参阅本手册部分),但是将其视为本身就是一个运算符是误导性的。这就是为什么有些人更喜欢写作而不是 - 它意味着同样的事情,但强调“引用y-ness”是赋值的属性,而不是变量的属性。$foo =& $bar$foo = &$bar

在某些编程语言中,例如C或C++,您可以“获取对”特定变量的引用;生成的值可以作为一个不同的实体传递,然后“取消引用”以找出它指向的位置。这不是PHP引用是什么。

相反,所有 PHP 变量实际上都是对称为 .你不能在PHP中直接操作s,也不能创建额外的间接层 - 每个变量都是对,仅此而已。(请参阅警告:下面的对象。zvalzvalzval

逐个引用赋值 ()、逐个引用传递 () 或逐个引用返回 () 的作用是告诉 PHP 您希望两个变量指向同一个 。请注意,您不是将一个变量指向另一个变量 - 它们都同样“真实”,并且调用任何一个变量都会使另一个变量完全保持不变。$foo =& $barfunction foo(&$bar) { ... }return &$foozvalunset()

注意事项:对象

人们经常误导性地说,因为PHP5对象“总是通过引用传递”。事实是,它们具有额外的间接层,其中本身就是指向特定对象的指针。这给了我们三个不同的东西,我们可以参考:变量,它指向的,以及指向的对象:zvalzval

// 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);

推荐