Trabalhando com arrays PHP com segurança de tipos, parte 2

Olá a todos, já se passou quase um ano desde a publicação da primeira parte . A discussão nos comentários foi quente, tirei conclusões para mim mesmo, fiz alterações na biblioteca quase imediatamente, mas não havia tempo para escrever sobre isso.

Recentemente, expandi a funcionalidade com alguns métodos e quero compartilhar essa novidade com você.

E, claro, vou escrever sobre como trabalhar com bugs.

Para aqueles que não sabiam e esqueceram o que é um ArrayHandler

Spoiler

Vamos responder à pergunta: "o que é seguro para tipos trabalhar com matrizes em PHP?"

O tipo seguro é:

  • ;

  • ;

, , - . , :

$a = 0;
if (key_exists($key, $collection)) 
{
	$a = (int) $collection[$key];
}

:

$a = (int) $collection[$key] ?? 0;

, " ".

Além dessas três vantagens, ArrayHandler oferece imutabilidade, ou seja, podemos passar com segurança nosso ArrayHandler por camadas de abstrações e ninguém irá alterar acidentalmente os elementos dentro do array original. Para alterar o valor, você precisa criar uma nova instância de ArrayHandler - e isso é mais difícil de ignorar na revisão do código do que ignorar a gravação de um novo valor em um elemento da matriz.

Eu não copiarei e colarei exemplos de trabalho com nenhum dos dois, você pode vê-los na primeira parte ou pode ler a documentação .

Liba é instalado através do Composer:

composer require sbwerewolf/language-specific

Existem versões para PHP 5.6 / 7.0 / 7.2.

Foi uma longa introdução agora ao ponto.

Atualizações

Alguns dias atrás eu estava triste e entediado, queria fazer algo bom, por exemplo, torná-lo de forma que quando você iterar sobre os elementos usando foreach (), você pudesse obter não apenas o elemento (ValueHandler), mas o índice desse elemento.

Comecei a trabalhar com entusiasmo e já tendo escrito toneladas de código, me deparei com um comentário na documentação do PHP que tornava todo o novo código inútil.

Acontece que você pode fazer isso:

yield $key => $value;

E foreach () retornará o índice do elemento. Eureka!

Agora IArrayHandler :: pull () retorna o novo IArrayHandler do elemento da matriz e o índice desse elemento. Fiquei feliz, parece que agora o ArrayHandler se tornou uma biblioteca ideal para trabalhar com arrays (como indiquei no início do artigo).

. - IArrayHandler::getting(), Iterator ArrayHandler foreach() .

IArrayHandler::pulling() ArrayHandler ( , ). "pulling" - IArrayHandler::pull(), ArrayHandler .

IArrayHandler::getting() IValueHandler , . "getting" - IArrayHandler::get(), IValueHandler .

IArrayHandler::pulling() , IArrayHandler::getting() .

:

$data = new ArrayHandler(
    [
        'first' => ['A' => 1],
        'next' => ['B'=>2],
        'last' => ['C'=>3],
        4=>[5,6],
        7,
        8,
        9
    ]);

echo 'arrays'.PHP_EOL;
foreach ($data->pulling() as $key => $value) {
    echo "[$key] => class is ".get_class($value).' '.PHP_EOL;
}
echo 'values'.PHP_EOL;
foreach ($data->getting() as $key => $value) {
    echo "[$key] => {$value->asIs()} , class is ".get_class($value).' '.PHP_EOL;
}

:

arrays
[first] => class is LanguageSpecific\ArrayHandler 
[next] => class is LanguageSpecific\ArrayHandler 
[last] => class is LanguageSpecific\ArrayHandler 
[4] => class is LanguageSpecific\ArrayHandler 
values
[5] => 7 , class is LanguageSpecific\ValueHandler 
[6] => 8 , class is LanguageSpecific\ValueHandler 
[7] => 9 , class is LanguageSpecific\ValueHandler

, foreach():

$data = new ArrayHandler(
    [
        'first' => ['A' => 1],
        'next' => ['B'=>2],
        'last' => ['C'=>3],
        4=>[5,6],
        7,
        8,
        9
    ]);

echo 'ALL'.PHP_EOL;
foreach ($data as $key => $value) {
    $type = gettype($value->asIs());
    echo "[$key] => value type is $type , class is ".get_class($value).PHP_EOL;
}

:

ALL
[first] => value type is array , class is LanguageSpecific\ValueHandler
[next] => value type is array , class is LanguageSpecific\ValueHandler
[last] => value type is array , class is LanguageSpecific\ValueHandler
[4] => value type is array , class is LanguageSpecific\ValueHandler
[5] => value type is integer , class is LanguageSpecific\ValueHandler
[6] => value type is integer , class is LanguageSpecific\ValueHandler
[7] => value type is integer , class is LanguageSpecific\ValueHandler

, , , foreach(), :

foreach ($data as $key => $value) {
    /* @var \LanguageSpecific\ValueHandler $value */
    if($value->type() === 'array'){
        $handler = new ArrayHandler($value->array());
        /* some code */
    }
}

IValueHandler::default() , @GreedyIvan, , .

ArrayHandler::simplify() ,

ArrayHandler->simplify(), array_column? (c) @olegmar

C @olegmar.

O método IArrayHandler :: next () foi substituído por IArrayHandler :: pull (), este método itera sobre todos os arrays aninhados (primeiro nível de aninhamento). Não que o comentário de @Hett tenha me convencido diretamente, mas me fez pensar.

Obrigado @ ReDev1L pelo apoio nos comentários.

O método IArrayHandler :: raw () foi adicionado para obter a matriz original. Anteriormente, quando não era possível obter o índice de um elemento, era necessário iterar sobre o array original, agora, por experiência de uso, é necessário adicionar / subtrair elementos do array e criar um novo ArrayHandler a partir do array modificado.

Isso é tudo. Obrigado pela leitura.




All Articles