我不是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']];
}
Run Code Online (Sandbox Code Playgroud)
我想了解最后一行,$db_host = &$db_hosts[$db_item['hostid']];
.
它似乎正在创建一个新变量,$db_host
并在其中放置一些东西,但我不明白&$db_hosts
.
我有点怀疑,因为据我所知,这$db_hosts
是一个空阵列.
我发现了这个和这个,但我不太确定,因为在这些链接中,运算符是"=&",并且在代码中,运算符附加到变量"=&$ db_hosts"(它有一个空格=和&之间.
既然我试图修改它并且没有取得成功,我认为最好寻求帮助......
Lir*_*una 31
这些是引用,它们类似于C或C++中的"指针".
更多信息在PHP手册中.
在这种情况下,由于$db_hosts
是空的,构造$db_hosts[$db_item['hostid']]
将创建一个新的数组,其索引为空项,$db_item['hostid']
并返回该项的引用,使其$db_host
成为$db_hosts[$db_item['hostid']]
当前任何内容的"别名" .
dev*_*raj 13
问题:
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);
Run Code Online (Sandbox Code Playgroud)
所以上面的所有内容都是按位运算符和位的游戏.
其中一个有用的例子是简单的配置,如下面给出的,所以一个整数字段可以为你存储数千个组合.
大多数人已经阅读过这些文档,但没有说明这些按位运算符的实际用例.
<?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
Run Code Online (Sandbox Code Playgroud)
IMS*_*SoP 12
&
在PHP中以不同的方式用于表示引用(参见本手册部分),但将其视为操作符本身具有误导性.这就是为什么有些人喜欢写$foo =& $bar
而不是$foo = &$bar
- 这意味着同样的事情,但强调"reference-y-ness"是赋值的属性,而不是变量的属性.
在某些编程语言中,例如C或C++,您可以"获取"特定变量的引用; 结果值可以作为一个独立的实体传递,然后"取消引用"以找出它指向的位置.这不是 PHP引用的内容.
相反,所有 PHP变量实际上都是对称为a的内部类型的引用zval
.你不能直接zval
在PHP中操作s,也不能创建额外的间接层 - 每个变量都是对a的引用zval
,就是这样.(见警告:下面的对象.)
通过引用赋值($foo =& $bar
),引用传递(function foo(&$bar) { ... }
)或引用返回(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);
Run Code Online (Sandbox Code Playgroud)