Operador PHP “&”

No soy un progtwigdor de PHP (pero conozco otros idiomas), y estoy tratando de entender una página web que se hizo en PHP (5.1.6) para hacer algunos cambios.

La página tiene el siguiente código (simplificado):

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

Estoy tratando de entender la última línea, $db_host = &$db_hosts[$db_item['hostid']]; .

Parece estar creando una nueva variable, $db_host , y poniendo algo dentro, pero no entiendo &$db_hosts .

Estoy en duda porque, por lo que sé, $db_hosts es una matriz vacía.

Encontré esto y esto , pero no estoy muy seguro, porque en estos enlaces, el operador es “= &”, y en el código, el operador está conectado a la variable “= & $ db_hosts” (tiene un espacio entre = y &).

Como traté de modificarlo y no tuve éxito, pensé que era mejor pedir ayuda …

Esas son referencias, y son similares a “punteros” en C o C ++.

Más información está en el manual de PHP .

En este caso, dado que $db_hosts está vacío, el constructo $db_hosts[$db_item['hostid']] creará una nueva matriz con un elemento vacío en el índice de $db_item['hostid'] y devolverá la referencia del elemento, lo que $db_item['hostid'] $db_host actúa como un ‘alias’ para cualquier $db_hosts[$db_item['hostid']] actualmente.

& se utiliza de diversas formas en PHP para denotar referencias ( consulte esta sección del manual ), pero es engañoso pensar que es un operador en sí mismo. Esta es la razón por la cual algunas personas prefieren escribir $foo =& $bar lugar de $foo = &$bar ; significa lo mismo, pero enfatiza que la “referencia-y-ness” es una propiedad de la asignación, no del variables.

En algunos lenguajes de progtwigción, como C o C ++, puede “obtener una referencia” a una variable en particular; el valor resultante puede pasarse como una entidad distinta y luego “desreferenciarse” para descubrir hacia dónde apunta. Esto no es lo que son las referencias PHP.

En cambio, todas las variables de PHP son en realidad referencias a un tipo interno llamado zval . No se puede manipular directamente zval s en PHP, y tampoco se pueden crear capas adicionales de zval indirecto: cada variable es una referencia a un zval , y eso es todo. (Ver advertencia: objetos a continuación).

Qué asignación por referencia ( $foo =& $bar ), una referencia de paso a paso ( function foo(&$bar) { ... } ), o una devolución por referencia ( return &$foo ) Do es decirle a PHP que desea que dos variables apunten al mismo zval . Tenga en cuenta que no está apuntando una variable “a” otro – ambos son igualmente “reales”, y llamar a unset() en cualquiera de ellos dejará el otro completamente intacto.

Advertencia: objetos

A menudo se dice erróneamente que, dado que los objetos PHP5 son “siempre pasados ​​por referencia”. La verdad es que tienen una capa adicional de zval indirecto, donde el zval es en sí mismo un puntero a un objeto particular. Esto nos da tres cosas diferentes a las que nos podemos referir: la variable , el zval que apunta y el objeto que apunta a:

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

Pregunta :

¿Qué significa “&” aquí en PHP?

Operador PHP “&”

Hace que la vida sea más fácil una vez que nos acostumbramos … (ver el siguiente ejemplo con cuidado)

y normalmente comprueba que los bits configurados en $ a y $ b estén configurados.

¿Has notado cómo funcionan estas llamadas?

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

Entonces, detrás de todo lo anterior, está el juego de operador y bits bit a bit.

Un caso útil de estos es configuraciones sencillas como dar a continuación, por lo que un solo campo entero puede almacenar miles de combinaciones para usted.

La mayoría de las personas ya han leído los documentos, pero no confiaban en el caso de uso del mundo real de estos operadores bit a bit.

Ejemplo Eso es muy útil para la vida cotidiana de php

 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 

Asignar esa variable como referencia lo hace de modo que si posteriormente se cambia $ db_host, también cambiará la entrada correspondiente en la matriz $ db_hosts, y viceversa.

He visto un poco de uso bastante inútil de referencias en PHP, estilo de culto a la carga. Tal vez sea necesario, tal vez no; tendrías que mirar el rest del progtwig.

& se usa como referencia. Vea las referencias en http://php.net/manual/en/language.references.php :

Las referencias en PHP son un medio para acceder al mismo contenido variable por diferentes nombres. No son como punteros C; por ejemplo, no puede realizar la aritmética del puntero con ellos, no son direcciones de memoria reales, y así sucesivamente.

El & asigna por referencia .

El & se usa para obtener una referencia a una variable. Es similar a las referencias en otros lenguajes como C ++, con algunas diferencias significativas. Vea la sección del manual de PHP sobre referencias .