Digite seguro trabalhando com matrizes PHP

Olá pessoal, vou falar sobre minha própria bicicleta para um trabalho conveniente com matrizes em PHP.

Dica de tipo


As dicas de tipo apareceram no PHP7, o que permitiu ao IDE realizar uma melhor análise estática do código, a qualidade do nosso código melhorou (ou diz corretamente " ficou melhor "?).

Obviamente, anteriormente, era possível para o IDE escrever uma dica nos comentários do código, mas agora os tipos se tornaram parte do código e agora é possível refatorar e não ter medo de esquecer algo em algum lugar (refatorar, é claro, no sentido de renomear classes e interfaces).

Além do fato de ter sido possível especificar o tipo de saída, tornou-se possível especificar o tipo do argumento de entrada.

Mas, além dos bons recursos, a dica de tipo também impõe responsabilidades, ou seja, os tipos de variáveis ​​realmente devem ser os indicados na assinatura do método.

Se você não verificar os tipos, poderá obter erros nos métodos e construtores (os erros nos designers são especialmente encorajadores).

Escrever cheques manualmente é entediante, decidi automatizar esse negócio, mas não através da verificação, mas através da transmissão para o tipo desejado.

No meu trabalho, geralmente tenho que escrever do zero, geralmente são protótipos, analisadores ou ETLs para uma nova fonte de dados, na verdade também um analisador.

É claro que você trabalha com matrizes (por exemplo, quando lê em * .csv), pode trabalhar com o banco de dados por meio do ORM, mas para minhas tarefas é muito complicado, é conveniente trabalhar com o banco de dados por meio do PDO, que fornece dados novamente em matrizes. “Favorito” O Bitrix não sabe como retornar dados que não sejam em uma matriz.

Não importa como você precise recuperar dados de matrizes. Então, eu escrevi um invólucro para trabalhar com matrizes.

Para não copiar e colar o código de projeto para projeto, eu projetei o pacote para o Composer :

composer require sbwerewolf/language-specific 

Valuehandler


Meu primeiro requisito era sempre saber que tipo eu receberia. Antes disso, é claro, ainda teríamos que obter o valor, provavelmente pelo índice, então chegamos à conclusão de que precisamos do método get ().

E agora precisamos de métodos para transmissão, não há muitos tipos em PHP, temos os seguintes métodos:

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

Às vezes, as matrizes são exibidas, assim seja, para matrizes:

  • array ()

Às vezes, você só precisa obter o elemento como ele é:

  • asIs ()

Às vezes, pode não haver um elemento com um determinado índice e você precisa usar o valor padrão:

  • default ()

Arrayhandler


O próximo requisito era ser capaz de simplificar a matriz de um valor para exatamente esse valor.

Vou mostrar um exemplo da documentação:

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

Obviamente, você pode executar a matriz que será retornada da solicitação e fazer esta atribuição:

 $response[] = $element[0]; 

, mas não gosto muito, deixe acontecer automaticamente, para que o método simplify () apareça.

Bem, como temos um wrapper sobre a matriz, adicionaremos um método para verificar a presença do índice - has (), se você quiser examinar os elementos da matriz, o próximo método () ajudará.

Isso poderia ter sido interrompido porque o nível de automação alcançou um nível confortável, mas às vezes tenho que trabalhar com uma matriz aninhada de uma matriz aninhada, e é mais conveniente obter imediatamente um ArrayHandler para a matriz de destino, então adicionei o método pull (), que retorna um ArrayHandler para a matriz aninhada .

É assim:

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

É claro que você pode escrever assim:

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

, mas, aos meus olhos, ondula o número de colchetes, é mais conveniente para mim através de pull ().

Raciocínio geral


Quando o código é conectado a partir do Composer, é muito conveniente, exceto que você se livra da necessidade de copiar e colar, você obtém sua biblioteca com um comando e está sempre à mão.

Antes de fazer meu pacote, analisei análogos e não encontrei nada parecido, existem vários projetos que simplesmente envolvem uma matriz e, nesses projetos, eles envolvem muitos métodos para trabalhar com matrizes e não há segurança de tipo em lugar algum.

Aparentemente, escrever (int) ou (bool) na frente do nome da variável é simples e conveniente para todos e ninguém vê motivo para se preocupar com um repositório separado para essa coisa.

Os recursos da biblioteca são um pouco mais amplos que os descritos no artigo e mais informações podem ser obtidas na documentação (README.md) .

O PHP5 não é incomum; portanto, a biblioteca possui uma versão separada para o PHP5, difere da versão para o PHP7 pelo nome de vários métodos e, é claro, toda dica de tipo é apenas nos comentários.
Existe uma versão da biblioteca para PHP7.2, ela difere apenas no fato de o tipo do valor de retorno aparecer na assinatura do método object () - objeto.

O código é completamente coberto por testes, mas em princípio não há nada para quebrar :)

Use para a saúde!

Outro 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 olhar durante a depuração no JSON, em que números são números, valores lógicos são lógicos, sou muito mais agradável do que apenas strings.

imagem

E você?

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


All Articles