Trabajar con matrices PHP con seguridad de tipos, parte 2

Hola a todos, ha pasado casi un año desde la publicación de la primera parte . La discusión en los comentarios fue candente, saqué conclusiones para mí, hice cambios en la biblioteca casi de inmediato, pero no hubo tiempo para escribir sobre esto.

Recientemente, amplié la funcionalidad con un par de métodos y quiero compartir esta noticia con ustedes.

Y, por supuesto, escribiré sobre cómo trabajar con errores.

Para aquellos que no sabían y han olvidado lo que es un ArrayHandler

Revelación

Respondamos a la pregunta: "¿Qué es el trabajo seguro con tipos de matrices en PHP?"

Tipo seguro es:

  • ;

  • ;

, , - . , :

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

:

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

, " ".

Además de estas tres ventajas, ArrayHandler proporciona inmutabilidad, es decir, podemos pasar nuestro ArrayHandler de forma segura a través de capas de abstracciones y nadie cambiará accidentalmente los elementos dentro de la matriz original. Para cambiar el valor, debe crear una nueva instancia de ArrayHandler, y esto es más difícil de omitir en la revisión del código que omitir la escritura de un nuevo valor en un elemento de matriz.

Tampoco copiaré y pegaré ejemplos de trabajo con ellos, puedes verlos en la primera parte o puedes leer la documentación .

Liba se instala a través de Composer:

composer require sbwerewolf/language-specific

Hay versiones para PHP 5.6 / 7.0 / 7.2.

Fue una larga introducción ahora al punto.

Actualizaciones

Hace un par de días estaba triste y aburrido, quería hacer algo bueno, por ejemplo, hacerlo de modo que cuando iteras sobre los elementos usando foreach (), no solo puedas obtener el elemento (ValueHandler), sino el índice de este elemento.

Me puse a trabajar con entusiasmo y después de escribir toneladas de código, encontré un comentario en la documentación de PHP que inutilizó todo el nuevo código.

Resulta que puedes hacer esto:

yield $key => $value;

Y foreach () devolverá el índice del elemento. ¡Eureka!

Ahora IArrayHandler :: tirando () devuelve tanto el nuevo IArrayHandler del elemento de matriz como el índice de ese elemento. Estaba feliz, parece que ahora ArrayHandler se ha convertido en una biblioteca ideal para trabajar con matrices (como indiqué al principio del artículo).

. - 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.

El método IArrayHandler :: next () ha sido reemplazado por IArrayHandler :: pull (), este método itera sobre todas las matrices anidadas (primer nivel de anidación). No es que el comentario de @Hett me convenciera directamente, sino que me empujó a pensar.

Gracias a @ ReDev1L por el apoyo en los comentarios.

Se agregó el método IArrayHandler :: raw () para obtener la matriz original. Anteriormente, cuando no era posible obtener el índice de un elemento, era necesario iterar sobre la matriz original, ahora, por experiencia de uso, es necesario agregar / restar elementos de la matriz y crear un nuevo ArrayHandler a partir de la matriz modificada.

Eso es todo. Gracias por leer.




All Articles