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.