PHP "&" operator PHP "&" operator php php

PHP "&" operator


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.


& is used variously in PHP to denote References (see this manual section), but it is misleading to think of it as being an operator in its own right. This is why some people prefer to write $foo =& $bar rather than $foo = &$bar - it means the same thing, but emphasises that the "reference-y-ness" is a property of the assignment, not of the variables.

In some programming languages, such as C or C++, you can "get a reference to" a particular variable; the resulting value can be passed around as a distinct entity, and then "de-referenced" to find out where it points. This is not what PHP references are.

Instead, all PHP variables are actually references to an internal type called a zval. You cannot directly manipulate zvals in PHP, and nor can you make extra layers of indirection - every variable is a reference to a zval, and that's it. (See caveat: objects below.)

What an assignment-by-reference ($foo =& $bar), a pass-by-reference (function foo(&$bar) { ... }), or a return-by-reference (return &$foo) do is tell PHP that you want two variables to point at the same zval. Note that you are not pointing one variable "at" another - they are both equally "real", and calling unset() on either will leave the other completely untouched.

Caveat: objects

It is often misleadingly said that since PHP5 objects are "always passed by reference". The truth is that they have an extra layer of indirection, where the zval is itself a pointer to a particular object. This gives us three different things we can refer to: the variable, the zval it points at, and the object that that points at:

// 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_refunset($foo);


Question:

What does "&" mean here in PHP?

PHP "&" operator

Makes life more easier once we get used to it..(check example below carefully)

& usually checks bits that are set in both $a and $b are set.

have you even noticed how these calls works?

   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);

So behind all above is game of bitwise operator and bits.

One usefull case of these is easy configurations like give below, so a single integer field can store thousands of combos for you.

Most people have already read the docs but didn't reliase the real world use case of these bitwise operators.

Example That's can be very useful everyday php life

<?phpclass 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 birdnew Config(Config::TYPE_BIRD);//birdnew Config(Config::TYPE_BIRD | Config::TYPE_DOG);//dog birdnew Config(Config::TYPE_ALL & ~Config::TYPE_DOG & ~Config::TYPE_CAT);//rat lion bird