Ketik aman bekerja dengan array PHP

Halo semuanya, saya akan memberi tahu Anda tentang sepeda saya sendiri untuk pekerjaan yang nyaman dengan array di PHP.

Ketik mengisyaratkan


Petunjuk tipe muncul di PHP7, yang memungkinkan IDE melakukan analisis statis kode yang lebih baik, kualitas kode kami meningkat (atau dengan benar mengatakan " semakin baik "?).

Tentu saja, sebelumnya adalah mungkin bagi IDE untuk menulis petunjuk dalam komentar untuk kode, tetapi sekarang jenis telah menjadi bagian dari kode dan sekarang telah menjadi mungkin untuk refactor dan tidak takut bahwa Anda akan melupakan sesuatu di suatu tempat (refactor tentu saja dalam arti mengganti nama kelas dan antarmuka).

Selain fakta bahwa menjadi mungkin untuk menentukan jenis output, menjadi mungkin untuk menentukan jenis argumen input.

Tetapi di samping fitur-fitur yang bagus, tipe hinting juga membebankan tanggung jawab, yaitu, tipe-tipe variabel harus benar-benar ditunjukkan dalam tanda tangan metode.

Jika Anda tidak memeriksa jenis, Anda bisa mendapatkan kesalahan dalam metode dan konstruktor (kesalahan pada desainer sangat mendorong).

Menulis cek secara manual itu membosankan, saya memutuskan untuk mengotomatiskan bisnis ini, tetapi tidak melalui verifikasi, tetapi melalui casting ke tipe yang diinginkan.

Dalam pekerjaan saya, saya sering harus menulis dari awal, biasanya berupa prototipe, atau parser, atau ETL untuk sumber data baru, bahkan juga parser.

Tentu saja Anda bekerja dengan array (misalnya, ketika Anda membaca dari * .csv), Anda dapat bekerja dengan database melalui ORM, tetapi untuk tugas saya itu terlalu rumit, lebih mudah bagi saya untuk bekerja dengan database melalui PDO, yang memberi Anda data lagi dalam array. "Favorit" Bitrix tidak tahu cara mengembalikan data selain dalam larik.

Tidak peduli bagaimana Anda harus mengambil data dari array. Jadi saya menulis pembungkus untuk bekerja dengan array.

Agar tidak menyalin-menempelkan kode dari proyek ke proyek, saya merancang paket untuk Penggubah :

composer require sbwerewolf/language-specific 

Penangan nilai


Syarat pertama saya adalah selalu tahu tipe apa yang akan saya terima. Sebelum ini, tentu saja, kita masih harus mendapatkan nilainya, mungkin dengan indeks, jadi kita sampai pada kesimpulan bahwa kita memerlukan metode get ().

Dan sekarang kita perlu metode untuk casting, tidak ada banyak jenis dalam PHP, kita punya metode berikut:

  1. int ()
  2. str ()
  3. bool ()
  4. dobel ()

Array terkadang menemukan, jadi biarkan untuk array:

  • array ()

Terkadang Anda hanya perlu mendapatkan elemen apa adanya:

  • asIs ()

Terkadang mungkin tidak ada elemen dengan indeks yang diberikan, dan kemudian Anda perlu menggunakan nilai default:

  • default ()

Arrayhandler


Persyaratan berikutnya adalah untuk dapat menyederhanakan array dari satu nilai ke nilai ini.

Saya akan menunjukkan kepada Anda sebuah contoh dari dokumentasi:

 $connection = new PDO ($dsn,$login,$password); $command = $connection->prepare('select name from employee where salary > 10000'); $command->execute(); $data = $command->fetchAll(PDO::FETCH_ASSOC); /* $data = array ( 0 => array ( 'name' => 'Mike', ), 1 => array ( 'name' => 'Tom', ), 2 => array ( 'name' => 'Jerry', ), 3 => array ( 'name' => 'Mary', ) ); */ $names = new ArrayHandler($data); $result = $names->simplify(); echo var_export($result,true); /* LanguageSpecific\ArrayHandler::__set_state(array( '_data' => array ( 0 => 'Mike', 1 => 'Tom', 2 => 'Jerry', 3 => 'Mary', ), )) */ 

Anda tentu saja dapat menjalankan melalui array yang akan dikembalikan dari permintaan dan melakukan tugas ini:

 $response[] = $element[0]; 

, tapi saya tidak terlalu menyukainya, biarkan itu terjadi secara otomatis, jadi metode simplify () muncul.

Nah, karena kita memiliki pembungkus array, kita akan menambahkan metode untuk memeriksa keberadaan indeks - has (), jika Anda ingin membahas elemen-elemen array, metode next () akan membantu.

Ini bisa dihentikan karena tingkat otomatisasi mencapai tingkat yang nyaman, tetapi kadang-kadang saya harus bekerja dengan array bersarang dari array bersarang, dan lebih mudah bagi saya untuk segera mendapatkan ArrayHandler untuk array target, jadi saya menambahkan metode pull (), yang mengembalikan ArrayHandler untuk array bersarang .

Ini terlihat seperti ini:

 $address = new ArrayHandler($item)->pull('metaDataProperty')->pull('GeocoderMetaData')->pull('Address')->asIs(); 

Anda tentu saja dapat menulis seperti ini:

 $address = $item['GeoObject']['metaDataProperty']['GeocoderMetaData']['Address']; 

, tapi di mata saya riak pada jumlah tanda kurung, lebih mudah bagi saya melalui tarikan ().

Alasan umum


Ketika kode terhubung dari Composer itu sangat mudah, kecuali bahwa Anda menyingkirkan kebutuhan untuk menyalin-menempel, Anda mendapatkan perpustakaan Anda dengan satu perintah dan selalu ada di tangan.

Sebelum membuat paket saya, saya melihat analog dan tidak menemukan yang seperti itu, ada beberapa proyek yang hanya membungkus array, dan dalam proyek ini mereka hanya membungkus banyak metode untuk bekerja dengan array, dan tidak ada jenis keselamatan di mana pun.

Rupanya, menulis (int) atau (bool) di depan nama variabel itu sederhana dan nyaman untuk semua orang dan tidak ada yang melihat alasan untuk repot dengan repositori terpisah untuk hal ini.

Fitur pustaka sedikit lebih lebar daripada yang dijelaskan dalam artikel dan lebih banyak informasi dapat diperoleh dalam dokumentasi (README.md) .

PHP5 belum biasa, oleh karena itu perpustakaan memiliki versi terpisah untuk PHP5, berbeda dari versi untuk PHP7 dengan nama beberapa metode, dan tentu saja semua jenis petunjuk hanya dalam komentar.
Ada versi perpustakaan untuk PHP7.2, itu hanya berbeda dalam jenis nilai kembali muncul dalam tanda tangan objek () metode - objek.

Kode ini sepenuhnya dicakup oleh tes, tetapi pada prinsipnya tidak ada yang perlu dirusak :)

Gunakan untuk kesehatan!

Kasus penggunaan lain


 foreach ($featureMember as $item) { $pointInfo = extract($item); $info = new ArrayHandler($pointInfo); $address = $info->get('formatted')->default('')->str(); $longitude = $info->get('longitude')->default(61.402554)->double(); $latitude = $info->get('latitude')->default(55.159897)->double(); $undefined = !$info->get('formatted')->has(); $properties = ['longitude' => $longitude, 'latitude' => $latitude, 'address ' => $address ,'undefined'=>$undefined,]; $result = json_encode($properties); output($result); } 

Untuk melihat selama debugging di JSON di mana angka adalah angka, nilai-nilai logis logis, saya jauh lebih menyenangkan daripada hanya string.

gambar

Bagaimana dengan anda

Source: https://habr.com/ru/post/id476102/


All Articles