Travailler avec des tableaux PHP de type sécurisé, partie 2

Bonjour à tous, presque un an s'est écoulé depuis la publication de la première partie . La discussion dans les commentaires était chaude, j'ai tiré des conclusions pour moi-même, apporté des modifications à la bibliothèque presque immédiatement, mais je n'ai pas eu le temps d'écrire à ce sujet.

Récemment, j'ai élargi la fonctionnalité avec quelques méthodes, et je souhaite partager cette nouvelle avec vous.

Et bien sûr, j'écrirai sur le travail sur les bogues.

Pour ceux qui ne savaient pas et qui ont oublié ce qu'est ArrayHandler

Divulgacher

Répondons à la question: "Qu'est-ce que le type sécurisé fonctionne avec des tableaux en PHP?"

Type-safe est:

  • ;

  • ;

, , - . , :

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

:

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

, " ".

En plus de ces trois avantages, ArrayHandler offre l'immuabilité, c'est-à-dire que nous pouvons passer en toute sécurité notre ArrayHandler à travers des couches d'abstractions et personne ne changera accidentellement les éléments à l'intérieur du tableau d'origine. Afin de modifier la valeur, vous devez créer une nouvelle instance de ArrayHandler - et il est plus difficile d'ignorer la révision du code que d'écrire une nouvelle valeur dans un élément de tableau.

Je ne vais pas copier et coller des exemples de travail avec l'un ou l'autre, vous pouvez les voir dans la première partie ou vous pouvez lire la documentation .

Liba est installé via Composer:

composer require sbwerewolf/language-specific

Il existe des versions pour PHP 5.6 / 7.0 / 7.2.

C'était une longue introduction maintenant au point.

Mises à jour

Il y a quelques jours, j'étais à la fois triste et ennuyé, je voulais faire quelque chose de bien, par exemple, faire en sorte que lorsque vous parcourez les éléments en utilisant foreach (), vous puissiez non seulement obtenir l'élément (ValueHandler), mais l'index de cet élément.

J'ai commencé à travailler avec enthousiasme et ayant déjà écrit des tonnes de code, je suis tombé sur un commentaire dans la documentation PHP qui rendait tout le nouveau code inutile.

Il s'avère que vous pouvez faire ceci:

yield $key => $value;

Et foreach () retournera l'index de l'élément. Eureka!

Maintenant IArrayHandler :: pulling () renvoie à la fois le nouveau IArrayHandler de l'élément de tableau et l'index de cet élément. J'étais content, il semble que maintenant ArrayHandler soit devenu une bibliothèque idéale pour travailler avec des tableaux (comme je l'ai indiqué au début de l'article).

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

La méthode IArrayHandler :: next () a été remplacée par IArrayHandler :: pulling (), cette méthode itère sur tous les tableaux imbriqués (premier niveau d'imbrication). Non pas que le commentaire de @Hett m'ait convaincu directement, mais m'a poussé à réfléchir.

Merci à @ ReDev1L pour le soutien dans les commentaires.

La méthode IArrayHandler :: raw () a été ajoutée pour obtenir le tableau d'origine. Auparavant, lorsqu'il n'était pas possible d'obtenir l'index d'élément, il était nécessaire d'itérer sur le tableau d'origine, maintenant, par expérience d'utilisation, il est nécessaire d'ajouter / soustraire des éléments du tableau et de créer un nouveau ArrayHandler à partir du tableau modifié.

C'est tout. Merci d'avoir lu.




All Articles