PHP"&"运算符

Bob*_*ers 24 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']];
}
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']]当前任何内容的"别名" .

  • 而且,正如我们讨论PHP引用时,标题为"不要使用PHP引用"的帖子的链接是有序的 - http://schlueters.de/blog/archives/125-Do-not-use-PHP-references. HTML (7认同)
  • 有点纠正..它们实际上不像C中的指针.. http://www.php.net/manual/en/language.references.arent.php (4认同)

dev*_*raj 13

问题:

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);
Run Code Online (Sandbox Code Playgroud)

所以上面的所有内容都是按位运算符和位的游戏.

其中一个有用的例子是简单的配置,如下面给出的,所以一个整数字段可以为你存储数千个组合.

大多数人已经阅读过这些文档,但没有说明这些按位运算符的实际用例.

示例这可以是每天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
Run Code Online (Sandbox Code Playgroud)

  • 这是一个完全不同的运营商的一个很好的例子.它恰好也拼写为`&`,但问题中的运算符是*引用*的赋值,与按位运算无关. (3认同)

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)