Para empezar, para ilustrar el comportamiento que deseo, mire el siguiente código JS:
let firstObj; let secondObj; firstObj = secondObj = {innerAttribute: "the initial value"}; firstObj.innerAttribute = "a new value"; console.log(secondObj.innerAttribute);Esto generaría "un nuevo valor" ya que firstObj y secondObj apuntan al mismo objeto.
En mi aplicación, estoy haciendo una llamada ajax a un script PHP que podría verse así:
<?php $phpArray = array(); $phpArray["key1"] = $phpArray["key2"] = array("firstValue","secondValue"); json_encode($phpArray); ?>El problema es que cuando esta matriz se recibe en JS, key1 y key2 no apuntan al mismo objeto. Si hago esto en JS con el objeto recuperado con éxito:
retrievedObject["key1"][0] = "firstValueModified"; console.log(retrievedObject["key2"][0]);Muestra "firstValue", lo que indica que php creó dos objetos diferentes en lugar de dos punteros al mismo objeto. Intenté usar & en PHP así:
<?php $phpArray = array(); $phpArray["key1"] = array("firstValue","secondValue"); $phpArray["key2"] = &$phpArray["key1"]; json_encode($phpArray); ?>Pero esto tampoco produjo el comportamiento deseado.
Todos estos son ejemplos muy básicos de lo que estoy tratando de hacer, ya que mi código real es mucho más complejo. Solo quiero saber si es posible hacer que PHP devuelva un objeto a JS con múltiples propiedades o índices que apunten al mismo objeto interno, de modo que un cambio en uno sea un cambio en ambos.
La razón práctica por la que necesito esto es porque necesito importar un objeto en el que cada elemento tenga una referencia tanto numérica como asociativa (como lo que hace MYSQLI_BOTH, aunque parece hacerlo creando dos objetos diferentes), y necesito ser capaz de modificar cada elemento en JS a través de la referencia numérica o asociativa y tenerlo reflejado en el otro.
¿Es posible lo que estoy tratando de hacer?
No parece que necesite usar referencias/punteros en absoluto. Un puntero no se vincula a un valor de datos sino a una ubicación en la memoria. Es un mecanismo para ahorrar memoria o producir código eficiente.
En pocas palabras, una variable es como una casa en la que puedes poner cosas, mientras que un puntero es solo la dirección.
Si tiene su servidor PHP extrayendo datos de una base de datos MySQL y desea que esos datos se transfieran intactos al navegador del cliente para que puedan procesarse con JavaScript, entonces debe colocar esos datos en un objeto y serializarlos en JSON antes. enviándolo desde el servidor.
El objeto podría ser el objeto mysqli_result que genera MySQLi Database Extension cada vez que realiza una búsqueda, o puede crear una clase de almacenamiento de datos personalizada:
class dataHolder { public int $numerical_reference; public string $associative_reference; public array $data_row = array(); public function __construct( int $nr, string $ar, array $data ) { $this->numerical_reference = $nr; $this->associative_reference = $ar; $this->data_row = $data; } } Luego puede usar la función PHP serialize para convertir esos datos en una cadena JSON.
Referencia: https://www.php.net/manual/en/function.serialize