Bekerja dengan PHP array type-safe, bagian 2

Halo semuanya, hampir satu tahun telah berlalu sejak penerbitan bagian pertama . Diskusi di komentar panas, saya menarik kesimpulan untuk diri saya sendiri, membuat perubahan pada lib hampir segera, tetapi tidak ada waktu untuk menulis tentang ini.

Baru-baru ini, saya memperluas fungsionalitasnya dengan beberapa metode, dan saya ingin membagikan berita ini kepada Anda.

Dan tentu saja saya akan menulis tentang menangani bug.

Bagi yang belum tahu dan sudah lupa apa itu ArrayHandler

Spoiler

Mari kita jawab pertanyaan: "apa itu type-safe yang bekerja dengan array di PHP?"

Type-safe adalah:

  • ;

  • ;

, , - . , :

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

:

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

, " ".

Selain tiga keunggulan ini, ArrayHandler menyediakan keabadian, yaitu, kita dapat dengan aman meneruskan ArrayHandler kita melalui lapisan abstraksi dan tidak ada yang secara tidak sengaja akan mengubah elemen di dalam larik asli. Untuk mengubah nilainya, Anda perlu membuat instance baru dari ArrayHandler - dan ini lebih sulit untuk dilewati pada peninjauan kode daripada melewatkan penulisan nilai baru ke elemen array.

Saya juga tidak akan menyalin dan menempel contoh kerja, Anda dapat melihatnya di bagian pertama atau Anda dapat membaca dokumentasi .

Liba diinstal melalui Komposer:

composer require sbwerewolf/language-specific

Ada versi untuk PHP 5.6 / 7.0 / 7.2.

Itu adalah perkenalan yang panjang sekarang langsung ke intinya.

Pembaruan

Beberapa hari yang lalu saya sedih dan bosan, saya ingin melakukan sesuatu yang baik, misalnya, membuatnya sehingga ketika Anda menjalankan elemen menggunakan foreach (), Anda tidak hanya bisa mendapatkan elemen (ValueHandler), tetapi juga indeks elemen ini.

Saya mulai bekerja dengan antusias dan setelah menulis banyak kode, saya menemukan komentar di dokumentasi PHP yang membuat semua kode baru tidak berguna.

Ternyata Anda bisa melakukan ini:

yield $key => $value;

Dan foreach () akan mengembalikan indeks elemen. Eureka!

Sekarang IArrayHandler :: pulling () mengembalikan IArrayHandler baru dari elemen array dan indeks elemen itu. Saya senang, tampaknya sekarang ArrayHandler telah menjadi perpustakaan yang ideal untuk bekerja dengan array (seperti yang saya tunjukkan di awal artikel).

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

Metode IArrayHandler :: next () telah diganti dengan IArrayHandler :: pulling (), metode ini mengulang semua larik bersarang (tingkat bersarang pertama). Bukannya komentar dari @Hett meyakinkan saya secara langsung, tetapi mendorong saya untuk berpikir.

Terima kasih kepada @ ReDev1L atas dukungannya di komentar.

Metode IArrayHandler :: raw () ditambahkan untuk mendapatkan larik asli. Sebelumnya, ketika tidak memungkinkan untuk mendapatkan indeks elemen, itu perlu untuk mengulangi array asli, sekarang, dari pengalaman penggunaan, ada kebutuhan untuk menambah / mengurangi elemen array dan membuat ArrayHandler baru dari array yang dimodifikasi.

Itu saja. Terima kasih sudah membaca.




All Articles