Comprender a los niños y referencias en PHP

Me gusta pensar que me volví bastante bueno en PHP, pero admito que a menudo soy cuando siento que no sé nada. Una cosa que recientemente me ha molestado es la diferencia entre copias variables y referencias variables. A menudo, esta diferencia entra en juego con las propiedades de la función o el método, pero es más que eso. Espero que al leer este artículo esté mejor equipado para hacer frente a esta complicada sutileza en el lenguaje cuando le afecta. Referencias frente a niños Cuando creamos una variable transmitiendo un argumento a una función o método, casi siempre creamos una copia de esa variable. Pero en cambio, es posible que queramos crear solo una referencia. Una referencia es un alias, que permite que dos partes de nuestra aplicación actúen sobre la misma variable.
Esto preservará la memoria, aunque hoy es menos una preocupación que una vez. La verdadera razón para usar una referencia es que es una decisión de diseño útil, pero solo a veces. Veamos la diferencia. Mire primero esta clase, que no utiliza referencias. Adivina cuál será el resultado de la última línea: post = $ post;
}
Función pública get_post () {
devuelve $ this-> post;
}
}
$ my_post = nuevo my_post ();
$ post_mea-> set_post ($ post);
$ post = 2;
var_dump ($ my_post-> get_post ()); Si adivinaste 1, entonces tienes razón. Solo porque cambié $ Post a 2 fuera del campo de aplicación de la clase, no debería afectar la copia de $ Post, la presenté a la clase My_Post. Pero, ¿y si queremos? Luego debemos pasar $ Post en la clase My_Post a través de la referencia y establecer la propiedad post de esa clase por referencia.
post = & $ post;
}
Función pública get_post () {
devuelve $ this-> post;
}
}
$ my_post = nuevo my_post ();
$ post_mea-> set_post ($ post);
$ post = 2;
var_dump ($ my_post-> get_post ()); Lo único que cambió aquí es que puse un ampers antes de la variable $ post. Así que ahora es & $ Post. Ampersand le dice a PHP que cree una referencia, no una copia. Como resultado, la última línea, ahora muestra 2, no 1, porque la referencia a $ Post, se ha cambiado dentro de la clase.
Problemas con referencias a objetos basados ​​en lo que ha aprendido, eche un vistazo a este código y adivine qué imprimirá la última línea: dos = 2;
}
}
$ primero = new stdclass ();
$ primero-> dos = 1;
Nuevo segundo ($ primero);
var_dump ($ primero-> dos); Si adivinó 1, tendría sentido en función de lo que acaba de leer, porque el primer objeto no se pasa a través del segundo objeto. También estaría equivocado porque los objetos siempre se pasan a través de la referencia. Lo siento, te engañé, pero es una distinción importante. Pasemos a un ejemplo práctico que solíamos comprender realmente el problema y buscar soluciones si no es lo que desea.
En un artículo reciente de Torque, escribí una clase simple para rastrear los ganchos que fueron eliminados. En WordPress 4.7, hay una nueva clase WP_HOOK, que se usa para almacenar ganchos, que es lo que necesitaba almacenar para ganchos eliminados, para que pueda agregarlos más tarde. Una versión anterior de esa clase falló por razones que me fueron confusas hasta que recordé que los objetos siempre se pasan por referencia. Puede ver la versión final de esa clase aquí, que incluye las verificaciones de compatibilidad inversa que hemos eliminado a continuación para mayor claridad. Extraje mis versiones antes y después, para que pudieras ver la diferencia. Acabo de empezar con: <? Php

Función pública remove_all ($ gancho) {
Global $ wp_filter;
if (isset ($ wp_filter [$ gook])) {
$ all = $ wp_filter [$ gancho];
If (! Vacía ($ all)) {
$ this-> eliminado [$ gancho] = $ all;
remove_all_filters ($ gancho);
}
}
} En esta versión, recibo un objeto de la clase WP_HOOK y lo coloco en la variable $ All, que se almacena en la propiedad eliminada de esta clase. Incluso si la almacené en la propiedad antes de llamar a remove_all_filters (), el valor de esa propiedad todavía se ve afectado por el removel_ifilters () llame que restablece la propiedad de apelación inversa de ese objeto porque es una referencia.
Para hacer esto más claro, aquí hay una versión que no usa remove_all_filters () pero lo que hace esa función hace manualmente: eliminado [$ gancho] = $ all;
$ all-> callbacks = array ();
} Puede verlo y pensar que $ this-> eliminado [$ gancho]-> Las devoluciones de llamada no deben estar vacías, solo las devoluciones de llamada $ All-> deberían estar. Pero no hay dos cosas diferentes, una es una referencia a la otra. El problema del problema que me enfrentaba era que tenía que guardar una copia de un objeto, antes de dejar WordPress Remove_All_Filters () para modificar ese objeto. En lugar de mantener una copia, creamos una referencia. El problema del problema era crear un clon de objeto usando el clon de palabra clave al definir la propiedad $ todos. Así es como se ve: eliminado [$ gancho] = $ all;
remove_all_filters ($ gancho);
}
}
} Ahora $ todo es una copia del objeto en el que actúa WordPress con remove_all_filters (). Misión cumplida. El método mágico de la clonación de los objetos crea una nueva copia de un objeto, pero todas sus propiedades, que son objetos, siguen siendo referencias. Esta es una de las razones por las cuales PHP ofrece un método mágico __Clone (), que se llama en el objeto Clove después de clonarse el nuevo objeto.
Esto brinda la oportunidad de clonar cualquier propiedad que pueda ser referencias, si es necesario. Aquí hay un ejemplo que hace esto: $ valor) {
if (is_ob objeto ($ propiedad)) {
$ this-> $ propory = clone $ this-> $ propory;
}
}
}

Copyright statement: Unless otherwise noted, this article is Collected from the Internet, please keep the source of the article when reprinting.

Check Also

gkOVSBm5B8SgiXmo

Shopify vs WooCommerce – ¿Cuál es la mejor plataforma?(Comparación)

Shopify vs WooCommerce

Leave a Reply

Your email address will not be published. Required fields are marked *