PHP "&" operator

Viewed 95273

I'm not a PHP programmer (but know other languages), and I'm trying to understand a web page that was done in PHP (5.1.6) in order to do some changes.

The page has the following code (simplified):

$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']];
}

I'm trying to understand the last line, $db_host = &$db_hosts[$db_item['hostid']];.

It seems to be creating a new variable, $db_host, and putting something inside it, but I don't understand &$db_hosts.

I'm in doubt because as far as I know, $db_hosts is an empty array.

I found this and this, but I'm not quite sure, because in these links, the operator is "=&", and in the code, the operator is attached to the variable "= &$db_hosts" (it has an space between = and &).

Since I tried to modify it and didn't get success, I thought that it was better to ask for help...

8 Answers

Those are references, and they are similar to "pointers" in C or C++.

More information is in the PHP manual.

In this case, since $db_hosts is empty, the construct $db_hosts[$db_item['hostid']] will create a new array with an empty item on the index of $db_item['hostid'] and return the item's reference, making $db_host act as an 'alias' for whatever $db_hosts[$db_item['hostid']] is currently.

Assigning that variable as a reference makes it so that if later on $db_host is changed, the corresponding entry in the $db_hosts array will change as well, and vice versa.

I've seen a fair bit of rather pointless use of references in PHP, cargo cult style. Perhaps this one is needed, perhaps not - you'd have to look at the rest of the program.

& is used as a reference. See what references are in http://php.net/manual/en/language.references.php:

References in PHP are a means to access the same variable content by different names. They are not like C pointers; for instance, you cannot perform pointer arithmetic using them, they are not actual memory addresses, and so on.

The & is used to get a reference to a variable. It's similar to references in other languages like C++, with some significant differences. See the PHP Manual's section on references.

Here is simple example to explain the meaning of PHP & operator:

<?php

$x = "Hello";

$y = &$x;
echo "Value of x : " . $x . "\n";
echo "Value of y : " . $y . "\n";

$y = "Hi"; // Since $y is alias or reference of the variable $x, so value of $x will also be changed, see below:

echo "Value of x : " . $x . "\n";
echo "Value of y : " . $y . "\n";

Output of the above code is as follow:

Value of x : Hello
Value of y : Hello
Value of x : Hi
Value of y : Hi

From the above example, it is clear that it is reference of the variable.

From official documentation: What References Are

References in PHP are a means to access the same variable content by different names. They are not like C pointers; for instance, you cannot perform pointer arithmetic using them, they are not actual memory addresses, and so on. See What References Are Not for more information. Instead, they are symbol table aliases. Note that in PHP, variable name and variable content are different, so the same content can have different names. The closest analogy is with Unix filenames and files - variable names are directory entries, while variable content is the file itself. References can be likened to hardlinking in Unix filesystem.

Related