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

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

Ответ 1

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

Дополнительная информация находится в руководстве PHP.

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

Ответ 2

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

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

Вместо этого все PHP-переменные на самом деле ссылаются на внутренний тип, называемый zval. Вы не можете напрямую манипулировать zval в PHP, а также не можете создавать лишние слои косвенности - каждая переменная является ссылкой на zval и что она. (См. Caveat: объекты ниже.)

Какое назначение-по-ссылке ($foo =& $bar), pass-by-reference (function foo(&$bar) { ... }) или return-by-reference (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);

Ответ 3

Вопрос

Что значит "&" означает здесь в 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

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

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

Ответ 5

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

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

Ответ 7

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