Оператор PHP "&" - PullRequest
       71

Оператор PHP "&"

21 голосов
/ 05 февраля 2010

Я не программист 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" (между пробелами и = есть пробел).

Поскольку я пытался изменить его и не добился успеха, я подумал, что лучше обратиться за помощью ...

Ответы [ 7 ]

29 голосов
/ 05 февраля 2010

Это ссылки, и они похожи на "указатели" в C или C ++.

Более подробная информация содержится в руководстве по PHP .

В этом случае, поскольку $db_hosts пусто, конструкция $db_hosts[$db_item['hostid']] создаст новый массив с пустым элементом по индексу $db_item['hostid'] и вернет ссылку на элемент, заставив $db_host выступать в роли псевдонима. 'для того, что $db_hosts[$db_item['hostid']] в настоящее время.

12 голосов
/ 28 сентября 2013

& по-разному используется в PHP для обозначения ссылок ( см. Этот раздел руководства ), но вводить его в заблуждение, считая его оператором само по себе, неверно. Вот почему некоторые люди предпочитают писать $foo =& $bar вместо $foo = &$bar - это означает то же самое, но подчеркивает, что "reference-y-ness" является свойством присваивания, а не переменных.

В некоторых языках программирования, таких как C или C ++, вы можете «получить ссылку на» определенную переменную; результирующее значение может быть передано как отдельная сущность, а затем «разыменовано», чтобы выяснить, куда оно указывает. Это не что такое ссылки PHP.

Вместо этого все переменные PHP на самом деле являются ссылками на внутренний тип, называемый zval. Вы не можете напрямую манипулировать zval s в PHP, и при этом вы не можете создавать дополнительные слои косвенности - каждая переменная является ссылкой на 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);
10 голосов
/ 20 марта 2017

Вопрос

Что означает здесь "&" в 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
4 голосов
/ 05 февраля 2010

Назначение этой переменной в качестве ссылки делает так, что если впоследствии будет изменен $ db_host, изменится и соответствующая запись в массиве $ db_hosts, и наоборот.

Я видел довольно много бессмысленного использования ссылок в PHP, стиль грузового культа. Возможно, этот нужен, а может и нет - вам придется взглянуть на остальную часть программы.

3 голосов
/ 05 февраля 2010
3 голосов
/ 05 февраля 2010

& используется в качестве ссылки. Посмотрите, что ссылки в http://php.net/manual/en/language.references.php:

Ссылки в PHP являются средством получить доступ к тому же переменному содержимому с помощью разные имена. Они не похожи на С указатели; например, вы не можете выполнять арифметику указателей, используя их, они не являются реальными адресами памяти, и т. д.

2 голосов
/ 05 февраля 2010

Символ & используется для получения ссылки на переменную. Это похоже на ссылки в других языках, таких как C ++, с некоторыми существенными отличиями. См. Руководство PHP по ссылкам .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...