the_post_thumbnail tag site name get_the_post_thumbnail_url get_bloginfo blog php reference

php - site - wordpress title tag



Php por referencia (5)

¿Puede alguien explicar qué hace "y" en lo siguiente?

class TEST { } $abc =& new TEST();

Sé que es por referencia. ¿Pero alguien puede ilustrar por qué y cuándo necesitaría tal cosa? O dirígeme a una url donde esto se explica bien. No puedo comprender el concepto.

Muchas gracias.


En primer lugar, realmente no necesita usarlo si está utilizando PHP 5, en PHP 5 todos los objetos se pasan por referencia de manera predeterminada.

En segundo lugar, cuando asigna un objeto a un nombre de variable, ya sea por creación, pasando un parámetro o estableciendo un valor de variable, lo hace por referencia o por valor.

Pasar por referencia significa que pasa la referencia de memoria real para el objeto, por ejemplo, si pasó un objeto como parámetro a una función, cualquier cambio que la función haga a esa variable se reflejará también en el método principal, en realidad está cambiando el estado de ese objeto en la memoria.

La alternativa, pasar por valor significa que pasa una copia de ese objeto, no la referencia de memoria, por lo que los cambios que realice no se reflejarán en el original.


Podría ser útil pensarlo así: en PHP, todas las variables son realmente un tipo de puntero: las entradas en la tabla de símbolos, lo que asigna nombres de variable a valores, contienen un zval * en la implementación C del Zend Motor.

Durante la asignación, esto incluye establecer los argumentos de la función, la magia sucederá:

Si hace $a = $b , se creará una copia del valor apuntado por la entrada de la tabla de símbolos de $b y se colocará un puntero a este nuevo valor en la entrada de la tabla de símbolos para $a . Ahora, $a y $b señalarán valores diferentes. PHP usa esto como su convención de llamadas predeterminada.

Si realiza $a =& $b , la entrada de la tabla de símbolos para $a se establecerá en el puntero que figura en la entrada de la tabla de símbolos para $b . Esto significa que $a y $b ahora apuntan al mismo valor: son alias uno del otro con los mismos derechos hasta que el programador los recupere. También tenga en cuenta que $a no es realmente una referencia a $b , ambos son indicadores del mismo objeto.

Es por eso que llamarlos ''alias'' podría ser una buena idea para enfatizar las diferencias con la implementación de referencia de C ++:

En C ++, una variable que contiene un valor y una referencia creada a partir de esta variable no son iguales, esa es la razón por la cual hay cosas como referencias colgantes.

Para ser claros: no hay nada como un tipo de referencia en PHP, ya que todas las variables ya están implementadas internamente como punteros y, por lo tanto, cada una de ellas puede actuar como referencia.

Los objetos PHP5 siguen siendo consistentes con esta descripción: no se pasan por referencia, sino un puntero al objeto (el manual lo llama un ''identificador de objeto''); es posible que no se implemente como un puntero C real. No lo compruebo. se pasa por valor (es decir, copiado en la asignación como se describe arriba).

Consulte el manual para obtener detalles sobre la relación entre los objetos PHP5 y las referencias .


Tal como lo entiendo, no estás preguntando sobre las referencias PHP en general, sino sobre $foo =& new Bar(); lenguaje de construcción.

Esto solo se ve en PHP4 ya que el usual $foo = new Bar() almacena una copia del objeto. Esto generalmente pasa desapercibido a menos que la clase haya almacenado una referencia a $ this en el constructor. Cuando llame a un método sobre el objeto devuelto más tarde, habría dos copias distintas del objeto en existencia cuando la intención era probablemente tener solo una.

Considere este código donde el constructor almacena una referencia a $ this en una var global

class Bar { function Bar(){ $GLOBALS[''copy'']=&$this; $this->str="hello"; } } //store copy of constructed object $x=new Bar; $x->str="goodbye"; echo $copy->str."/n"; //hello echo $x->str."/n"; //goodbye //store reference to constructed object $x=&new Bar; $x->str="au revoir"; echo $copy->str."/n"; //au revoir echo $x->str."/n"; //au revoir

En el primer ejemplo, $ x y $ copy se refieren a diferentes instancias de Foo, pero en el segundo son iguales.


Una forma más simple de verlo puede ser así:

$a = ''foo''; $b = ''bar''; $a =& $b; $b = ''foobar''; echo $a . '' '' . $b;

saldrá

foobar foobar


El Manual de PHP hace un trabajo bastante decente de explicar referencias.

Debo señalar que NO son lo mismo que un puntero o una referencia en muchos otros idiomas, aunque hay similitudes. Y en cuanto a los objetos que son "pasados ​​por referencia" por defecto, eso tampoco es exactamente cierto.

Yo recomendaría leer la sección del manual primero (y probablemente luego volver a leer un par de veces hasta que la obtenga), y luego volver aquí si todavía tiene más preguntas.