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 &$fooreturn &$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

下一篇: Understanding PHP & (ampersand, bitwise and) operator