タイプセーフなPHPアレイの操作、パート2

みなさん、こんにちは前編が公開されてからもうすぐ1年になります。コメントでの議論は熱く、私は自分で結論を出し、ほとんどすぐにライブラリに変更を加えましたが、これについて書く時間はありませんでした。

最近、いくつかの方法で機能を拡張しました。このニュースを皆さんと共有したいと思います。

そしてもちろん、私はバグに取り組むことについて書きます。

ArrayHandlerとは何かを知らず、忘れてしまった方へ

ネタバレ

「PHPで配列を操作するタイプセーフとは何ですか?」という質問に答えましょう。

タイプセーフは次のとおりです。

  • ;

  • ;

, , - . , :

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

:

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

, " ".

これらの3つの利点に加えて、ArrayHandlerは不変性を提供します。つまり、ArrayHandlerを抽象化のレイヤーに安全に渡すことができ、元の配列内の要素を誤って変更することはありません。値を変更するには、ArrayHandlerの新しいインスタンスを作成する必要があります。これは、配列要素への新しい値の書き込みをスキップするよりも、コードレビューをスキップする方が困難です。

どちらの作業例もコピーして貼り付けることはしません最初の部分でそれら確認するか、ドキュメント読むことができます

LibaはComposerからインストールされます。

composer require sbwerewolf/language-specific

PHP 5.6 / 7.0 /7.2のバージョンがあります。

それは今のところ長い紹介でした。

更新

数日前、私は悲しくて退屈でした。たとえば、foreach()を使用して要素を反復処理するときに、要素(ValueHandler)だけでなく、この要素のインデックスも取得できるようにするなど、何か良いことをしたいと思いました。

私は熱心に仕事をするようになり、たくさんのコードを書いた後、PHPドキュメントですべての新しいコードを役に立たなくするコメントに出くわしました。

あなたがこれを行うことができることがわかります:

yield $key => $value;

そして、foreach()は要素のインデックスを返します。ユーレカ!

IArrayHandler :: pulling()は、配列要素からの新しいIArrayHandlerとその要素のインデックスの両方を返します。私は満足していました。ArrayHandlerが配列を操作するための理想的なライブラリになっているようです(記事の冒頭で示したように)。

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

IArrayHandler :: next()メソッドはIArrayHandler :: pulling()に置き換えられました。このメソッドは、ネストされたすべての配列(最初のネストレベル)を反復処理します。@Hettからのコメントが私を直接納得させたわけではありませんが、私を考えさせました。

コメントでサポートしてくれた@ ReDev1Lに感謝します。

元の配列を取得するために、IArrayHandler :: raw()メソッドが追加されました。以前は、要素インデックスを取得できなかった場合、元の配列を反復処理する必要がありましたが、使用経験から、配列要素を追加/削除し、変更された配列から新しいArrayHandlerを作成する必要があります。

それで全部です。読んでくれてありがとう。




All Articles