Saltar al contenido

Asignación de desestructuración en php para objetos / matrices asociativas

Contamos con el hallazgo a esta dificultad, o por lo menos eso pensamos. Si tienes dudas compártelo en un comentario y sin dudas

Solución:

Para PHP 7.0 y versiones anteriores, eso está más allá de la funcionalidad de list. Los documentos dicen:

list solo funciona en matrices numéricas y asume que los índices numéricos comienzan en 0.

Una de las cosas que podría adaptarse a su propósito sería la extract() función que importa variables de un array en la tabla de símbolos actual. mientras que con list puede definir nombres de variables explícitamente, extract() no te da esta libertad.

Extrayendo un asociativo array

Con extract podrías hacer algo así:

 'coffee', 'color' => 'brown', 'power' => 'caffeine' ];
extract($info);

var_dump($drink); // string(6) "coffee"
var_dump($color); // string(5) "brown"
var_dump($power); // string(8) "caffeine"

Extraer un objeto

Extraer un objeto funciona casi igual. Ya que extract solo toma un array como argumento necesitamos obtener las propiedades de los objetos como un array. get_object_vars hace eso por ti. Devuelve un asociativo. array con toda público propiedades como key y sus valores como valor.

Trampas

extract() no es lo mismo que list ya que no le permite definir explícitamente los nombres de las variables que se exportan a la tabla de símbolos. Los nombres de las variables corresponden array keys por defecto.

  • list es una construcción del lenguaje mientras que extract() es una funcion
  • Puede suceder que sobrescriba las variables que ha definido de antemano sin querer
  • Tu array keys podría no ser válido como nombres de variables

Con el $flags parámetro que puede pasar como segundo argumento a extract() puede influir en el comportamiento en caso de colisión o variables no válidas. Pero aún así es importante saber cómo extract() funciona y utilizarlo con precaución.

Editar: a partir de PHP 7.1 esto es posible:

http://php.net/manual/en/migration71.new-features.php#migration71.new-features.support-for-keys-en lista

Ahora puede especificar keys in list(), o su nueva abreviatura [] sintaxis. Esto permite la desestructuración de arreglos con valores no enteros o no secuenciales. keys.

https://php.net/manual/en/migration71.new-features.php#migration71.new-features.metric-array-desestructurar

la taquigrafía array sintaxis ([]) ahora se puede usar para desestructurar arreglos para asignaciones (incluso dentro de foreach), como una alternativa a la sintaxis list() existente, que todavía es compatible.

Por ejemplo esto:

$test_arr = ['a' => 1, 'b' => 2];
list('a' => $a, 'b' => $b) = $test_arr;
var_dump($a);
var_dump($b);

Dará salida a lo siguiente a partir de 7.1.0

int(1) 
int(2)

Noté que la respuesta aceptada omitió ejemplos que usan la notación abreviada, problemas de seguridad con el uso de extractos y problemas de IDE.

Destrucción de matrices numéricas (PHP 7.1)

A partir de PHP 7.1 numérico array destruir (simétrica array desestructuración) se admite así:

Tenga en cuenta que puede perder elementos si no los quiere.

Destrucción de matriz asociativa (PHP 7.1)

también puedes hacer array destruir en matrices asociativas (Soporte para keys en la lista) así:

 55, 'firstName' => 'John', 'country' => 'UK']
['id' => $id, 'firstName' => $name] = $data; // short-hand (recommended)
list('id' => $id, 'firstName' => $name) = $data; // long-hand

Tenga en cuenta que puede perder elementos si no los quiere. Además, el nombre de la variable puede ser diferente al nombre de la propiedad.

Destrucción de objetos (PHP 7.1)

Desafortunadamente no hay destrucción de objetos. Sin embargo, puede convertir un objeto en un asociativo array utilizando get_object_varsy luego use asociativo array destruyendo

id = 55;
$user->name = 'John';
$user->country = 'UK';

['id' => $id, 'firstName' => $name] = get_object_vars($user)

Sin embargo, esto puede romper algunas funciones del IDE. Estos son algunos problemas que noté al usar PHPStorm 2019.1:

  • Es posible que los IDE ya no comprendan el tipo de las variables, por lo que deberá agregar algunos @var Type PHPDocs para mantener la funcionalidad de autocompletar
  • No funciona bien con herramientas de refactorización. Por ejemplo, si cambia el nombre de una de las propiedades, la array la parte que se destruye no cambiará de nombre automáticamente.

Así que recomiendo hacerlo de la manera normal:

$id = $user->id
$name = $user->firstName

No utilice extract

Con extract, todas las variables siempre están configuradas. Allí es una muy mala idea usarlo porque:

  • Puede conducir a problemas de seguridad. Incluso si tiene cuidado, puede conducir a agujeros de seguridad no obvios en el futuro. Si lo usa, no lo use con la entrada del usuario (por ejemplo, $_GET, $_POST), a menos que desee alegrar el día de un hacker malicioso.
  • Puede conducir a errores difíciles de detectar
  • Si la clase o array cambios en el futuro, al introducir nuevas propiedades, puede romper tu código si coincide con una variable ya utilizada, a menos que uses la EXTR_SKIP bandera o similar

Sección de Reseñas y Valoraciones

Ten en cuenta dar visibilidad a esta sección si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Respuestas a preguntas comunes sobre programacion y tecnología