Escriba seguro trabajando con matrices PHP

Hola a todos, les contaré sobre mi propia bicicleta para un trabajo conveniente con matrices en PHP.

Sugerencia de tipo


Las sugerencias de tipo aparecieron en PHP7, lo que permitió que el IDE realizara un mejor análisis estático del código, la calidad de nuestro código mejoró (¿o dice correctamente " mejoró "?).

Por supuesto, antes era posible que el IDE escribiera una pista en los comentarios para el código, pero ahora los tipos se han convertido en parte del código y ahora es posible refactorizar y no tener miedo de que olvide algo en alguna parte (refactor, por supuesto, en el sentido de renombrar clases e interfaces).

Además del hecho de que fue posible especificar el tipo de salida, también fue posible especificar el tipo del argumento de entrada.

Pero además de las buenas características, la sugerencia de tipos también impone responsabilidades, es decir, los tipos de variables realmente deberían ser como se indica en la firma del método.

Si no verifica los tipos, puede obtener errores en los métodos y constructores (los errores en los diseñadores son especialmente alentadores).

Escribir cheques manualmente es tedioso, decidí automatizar este negocio, pero no a través de la verificación, sino a través del envío al tipo deseado.

En mi trabajo, a menudo tengo que escribir desde cero, por lo general, son prototipos, analizadores o ETL para una nueva fuente de datos, de hecho, también un analizador.

Por supuesto, usted trabaja con matrices (por ejemplo, cuando lee desde * .csv), puede trabajar con la base de datos a través de ORM, pero para mis tareas es demasiado engorroso, es conveniente para mí trabajar con la base de datos a través de PDO, que le da datos nuevamente en matrices. "Favorito" Bitrix no sabe cómo devolver datos que no sean en una matriz.

No importa cómo tenga que recuperar datos de las matrices. Entonces escribí un contenedor para trabajar con matrices.

Para no copiar y pegar el código de un proyecto a otro, diseñé el paquete para Composer :

composer require sbwerewolf/language-specific 

Valuehandler


Mi primer requisito era saber siempre qué tipo recibiría. Antes de esto, por supuesto, todavía tendríamos que obtener el valor, probablemente por el índice, por lo que llegamos a la conclusión de que necesitamos el método get ().

Y ahora necesitamos métodos para emitir, no hay muchos tipos en PHP, tenemos los siguientes métodos:

  1. int ()
  2. str ()
  3. bool ()
  4. doble ()

Las matrices a veces aparecen, así que déjalo ser para matrices:

  • array ()

A veces solo necesitas obtener el elemento tal como está:

  • asIs ()

A veces, un elemento con un índice dado puede no estar allí y luego debe usar el valor predeterminado:

  • predeterminado ()

Arrayhandler


El siguiente requisito era poder simplificar la matriz de un valor a exactamente este valor.

Te mostraré un ejemplo de la documentación:

 $connection = new PDO ($dsn,$login,$password); $command = $connection->prepare('select name from employee where salary > 10000'); $command->execute(); $data = $command->fetchAll(PDO::FETCH_ASSOC); /* $data = array ( 0 => array ( 'name' => 'Mike', ), 1 => array ( 'name' => 'Tom', ), 2 => array ( 'name' => 'Jerry', ), 3 => array ( 'name' => 'Mary', ) ); */ $names = new ArrayHandler($data); $result = $names->simplify(); echo var_export($result,true); /* LanguageSpecific\ArrayHandler::__set_state(array( '_data' => array ( 0 => 'Mike', 1 => 'Tom', 2 => 'Jerry', 3 => 'Mary', ), )) */ 

Por supuesto, puede ejecutar la matriz que se devolverá de la solicitud y realizar esta asignación:

 $response[] = $element[0]; 

, pero no me gusta tanto, deje que suceda automáticamente, por lo que apareció el método simplify ().

Bueno, dado que tenemos un contenedor sobre la matriz, agregaremos un método para verificar la presencia del índice - has (), si desea repasar los elementos de la matriz, el método next () será de ayuda.

Esto podría haberse detenido porque el nivel de automatización alcanzó un nivel cómodo, pero a veces tengo que trabajar con una matriz anidada de una matriz anidada, y es más conveniente para mí obtener inmediatamente un ArrayHandler para la matriz de destino, así que agregué el método pull (), que devuelve un ArrayHandler para la matriz anidada .

Se ve así:

 $address = new ArrayHandler($item)->pull('metaDataProperty')->pull('GeocoderMetaData')->pull('Address')->asIs(); 

Por supuesto, puedes escribir así:

 $address = $item['GeoObject']['metaDataProperty']['GeocoderMetaData']['Address']; 

, pero en mis ojos se ondula la cantidad de corchetes, es más conveniente para mí mediante pull ().

Razonamiento general


Cuando el código se conecta desde Composer, es muy conveniente, excepto que elimina la necesidad de copiar y pegar, obtiene su biblioteca con un comando y siempre está a mano.

Antes de hacer mi paquete, miré los análogos y no encontré nada parecido, hay varios proyectos que simplemente se ajustan en una matriz, y en estos proyectos simplemente envuelven muchos métodos para trabajar con matrices, y no hay ningún tipo de seguridad en ningún lado.

Aparentemente, escribir (int) o (bool) delante del nombre de la variable es simple y conveniente para todos y nadie ve ninguna razón para molestarse con un repositorio separado para esta cosa.

Las características de la biblioteca son ligeramente más amplias que las descritas en el artículo y se puede obtener más información en la documentación (README.md) .

PHP5 no es infrecuente, por lo que la biblioteca tiene una versión separada para PHP5, difiere de la versión para PHP7 por el nombre de varios métodos y, por supuesto, todo tipo de sugerencia es solo en comentarios.
Existe una versión de la biblioteca para PHP7.2, solo difiere en que el tipo del valor de retorno aparece en la firma del método object () - objeto.

El código está completamente cubierto por las pruebas, pero en principio no hay nada que romper :)

Uso para la salud!

Otro caso de uso


 foreach ($featureMember as $item) { $pointInfo = extract($item); $info = new ArrayHandler($pointInfo); $address = $info->get('formatted')->default('')->str(); $longitude = $info->get('longitude')->default(61.402554)->double(); $latitude = $info->get('latitude')->default(55.159897)->double(); $undefined = !$info->get('formatted')->has(); $properties = ['longitude' => $longitude, 'latitude' => $latitude, 'address ' => $address ,'undefined'=>$undefined,]; $result = json_encode($properties); output($result); } 

Para observar durante la depuración en JSON en el que los números son números, los valores lógicos son lógicos, soy mucho más agradable que solo cadenas.

imagen

Que tal tu

Source: https://habr.com/ru/post/476102/


All Articles