Tapez travailler en toute sécurité avec les tableaux PHP

Bonjour à tous, je vais vous parler de mon propre vélo pour un travail pratique avec les tableaux en PHP.

Indication de type


L'indication de type est apparue en PHP7, ce qui a permis à l'EDI de réaliser une meilleure analyse statique du code, la qualité de notre code s'est améliorée (ou dit correctement " ça s'est amélioré "?).

Bien sûr, auparavant, il était possible pour l'EDI d'écrire un indice dans les commentaires du code, mais maintenant les types sont devenus une partie du code et maintenant il est devenu possible de refactoriser et de ne pas avoir peur d'oublier quelque chose quelque part (refactoriser bien sûr dans le sens de renommer les classes et les interfaces).

En plus de permettre de spécifier le type de sortie, il est désormais possible de spécifier le type de l'argument d'entrée.

Mais en plus des fonctionnalités intéressantes, l'indication de type impose également des responsabilités, c'est-à-dire que les types de variables doivent vraiment être ceux indiqués dans la signature de la méthode.

Si vous ne cochez pas les types, vous pouvez obtenir des erreurs dans les méthodes et les constructeurs (les erreurs dans les concepteurs sont particulièrement encourageantes).

La rédaction manuelle des chèques est fastidieuse, j'ai décidé d'automatiser cette activité, mais pas par vérification, mais par casting au type souhaité.

Dans mon travail, je dois souvent écrire à partir de zéro, généralement c'est soit des prototypes, soit des analyseurs, soit des ETL pour une nouvelle source de données, en fait aussi un analyseur.

Bien sûr, vous travaillez avec des tableaux (par exemple, lorsque vous lisez à partir de * .csv), vous pouvez travailler avec la base de données via ORM, mais pour mes tâches, c'est trop lourd, il est pratique pour moi de travailler avec la base de données via PDO, ce qui vous donne à nouveau des données dans des tableaux. Bitrix «favori» ne sait pas comment renvoyer des données autrement que dans un tableau.

Peu importe la façon dont vous devez récupérer les données des tableaux. J'ai donc écrit un wrapper pour travailler avec des tableaux.

Afin de ne pas copier-coller le code du projet vers le projet, j'ai conçu le package pour Composer :

composer require sbwerewolf/language-specific 

Gestionnaire de valeur


Ma première exigence était de toujours savoir quel type je recevrais. Avant cela, bien sûr, il nous faudrait encore obtenir la valeur, probablement par l'index, donc nous sommes arrivés à la conclusion que nous avions besoin de la méthode get ().

Et maintenant, nous avons besoin de méthodes de cast, il n'y a pas beaucoup de types en PHP, nous avons les méthodes suivantes:

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

Les tableaux se rencontrent parfois, alors que ce soit pour les tableaux:

  • tableau ()

Parfois, il vous suffit de récupérer l'élément tel qu'il est:

  • asIs ()

Parfois, il peut ne pas y avoir d'élément avec un index donné, puis vous devez utiliser la valeur par défaut:

  • défaut ()

Arrayhandler


La prochaine exigence était de pouvoir simplifier le tableau d'une valeur à exactement cette valeur.

Je vais vous montrer un exemple de la documentation:

 $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', ), )) */ 

Vous pouvez bien sûr parcourir le tableau qui sera renvoyé à partir de la demande et effectuer cette affectation:

 $response[] = $element[0]; 

, mais je ne l'aime pas tellement, laissez-le se produire automatiquement, donc la méthode simplify () est apparue.

Eh bien, puisque nous avons un wrapper sur le tableau, nous ajouterons une méthode pour vérifier la présence de l'index - has (), si vous voulez parcourir les éléments du tableau, la méthode next () vous aidera.

Cela aurait pu être arrêté car le niveau d'automatisation a atteint un niveau confortable, mais parfois je dois travailler avec un tableau imbriqué d'un tableau imbriqué, et il est plus pratique pour moi d'obtenir immédiatement un ArrayHandler pour le tableau cible, j'ai donc ajouté la méthode pull (), qui renvoie un ArrayHandler pour le tableau imbriqué .

Cela ressemble à ceci:

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

Vous pouvez bien sûr écrire comme ceci:

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

, mais à mes yeux ondule sur le nombre de crochets, c'est plus pratique pour moi grâce à pull ().

Raisonnement général


Lorsque le code est connecté à partir de Composer, c'est très pratique, sauf que vous vous débarrassez du besoin de copier-coller, vous obtenez votre bibliothèque avec une seule commande et elle est toujours à portée de main.

Avant de créer mon package, j'ai regardé des analogues et je n'ai rien trouvé de tel, il y a plusieurs projets qui enveloppent simplement un tableau, et dans ces projets ils encapsulent simplement de nombreuses méthodes pour travailler avec des tableaux, et il n'y a aucune sécurité de type nulle part.

Apparemment, écrire (int) ou (bool) devant le nom de la variable est simple et pratique pour tout le monde et personne ne voit de raison de s'embêter avec un référentiel séparé pour cette chose.

Les fonctionnalités de la bibliothèque sont légèrement plus larges que celles décrites dans l'article et plus d'informations peuvent être obtenues dans la documentation (README.md) .

PHP5 n'est pas rare, donc la bibliothèque a une version distincte pour PHP5, diffère de la version pour PHP7 par le nom de plusieurs méthodes, et bien sûr, toutes les indications de type ne sont que dans les commentaires.
Il existe une version de la bibliothèque pour PHP7.2, elle ne diffère que par le fait que le type de la valeur de retour apparaît dans la signature de la méthode object () - objet.

Le code est entièrement couvert par des tests, mais en principe il n'y a rien à casser :)

Utilisez pour la santé!

Un autre cas d'utilisation


 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); } 

Pour regarder lors du débogage sur JSON dans lequel les nombres sont des nombres, les valeurs logiques sont logiques, je suis beaucoup plus agréable que de simples chaînes.

image

Et vous?

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


All Articles