Saya lebih suka membaca dan menulis kode bersih - sebagaimana diuraikan dalam "Kode Bersih" oleh Robert C. Martin. Saat mengikuti kredo Anda, Anda tidak perlu meminta pengembang (sebagai pengguna API Anda) untuk mengetahui struktur (internal) array Anda.
Pengguna API dapat bertanya: Apakah itu array dengan satu dimensi saja? Apakah objek tersebar di semua tingkatan array multi dimensi? Berapa banyak loop bersarang (foreach, dll.) Yang saya perlukan untuk mengakses semua objek? Jenis objek apa yang "disimpan" dalam array itu?
Saat Anda menguraikan Anda ingin menggunakan array itu (yang berisi objek) sebagai array satu dimensi.
Seperti yang dijelaskan oleh Nishi, Anda dapat menggunakan:
/**
* @return SomeObj[]
*/
untuk itu.
Tetapi sekali lagi: waspada - ini bukan notasi docblock standar. Notasi ini diperkenalkan oleh beberapa produsen IDE.
Oke, oke, sebagai pengembang Anda tahu bahwa "[]" terikat ke sebuah array di PHP. Tapi apa arti "sesuatu []" dalam konteks PHP normal? "[]" berarti: membuat elemen baru di dalam "sesuatu". Elemen baru bisa menjadi segalanya. Tetapi apa yang ingin Anda ungkapkan adalah: array objek dengan tipe yang sama dan tipe tepat. Seperti yang Anda lihat, produsen IDE memperkenalkan konteks baru. Konteks baru yang harus Anda pelajari. Konteks baru yang harus dipelajari oleh pengembang PHP lain (untuk memahami dokumen Anda). Gaya buruk (!).
Karena array Anda memiliki satu dimensi, Anda mungkin ingin memanggil "array objek" sebagai "daftar". Ketahuilah bahwa "daftar" memiliki arti yang sangat istimewa dalam bahasa pemrograman lain. Akan lebih baik jika menyebutnya "koleksi" misalnya.
Ingat: Anda menggunakan bahasa pemrograman yang memungkinkan Anda semua opsi OOP. Gunakan kelas sebagai ganti array dan buat kelas Anda dapat dilalui seperti array. Misalnya:
class orderCollection implements ArrayIterator
Atau jika Anda ingin menyimpan objek internal pada level yang berbeda dalam array multi dimensi / struktur objek:
class orderCollection implements RecursiveArrayIterator
Solusi ini menggantikan array Anda dengan objek tipe "orderCollection", tetapi sejauh ini tidak memungkinkan penyelesaian kode di dalam IDE Anda. Baik. Langkah berikutnya:
Menerapkan metode yang diperkenalkan oleh antarmuka dengan docblocks - khususnya:
/**
* [...]
* @return Order
*/
orderCollection::current()
/**
* [...]
* @return integer E.g. database identifier of the order
*/
orderCollection::key()
/**
* [...]
* @return Order
*/
orderCollection::offsetGet()
Jangan lupa untuk menggunakan petunjuk tipe untuk:
orderCollection::append(Order $order)
orderCollection::offsetSet(Order $order)
Solusi ini berhenti memperkenalkan banyak:
/** @var $key ... */
/** @var $value ... */
seluruh file kode Anda (misalnya dalam loop), seperti yang dikonfirmasi Zahymaka dengan jawabannya. Pengguna API Anda tidak dipaksa untuk memperkenalkan docblock itu, untuk memiliki penyelesaian kode. Untuk memiliki @return hanya pada satu tempat mengurangi redundansi (@var) semut mungkin. Taburkan "docBlocks with @var" akan membuat kode Anda lebih mudah dibaca.
Akhirnya kamu sudah selesai. Terlihat sulit untuk dicapai? Sepertinya mengambil palu untuk memecahkan kacang? Tidak benar-benar, karena Anda terbiasa dengan antarmuka itu dan dengan kode bersih. Ingat: kode sumber Anda ditulis sekali / banyak dibaca.
Jika penyelesaian kode IDE Anda tidak berfungsi dengan pendekatan ini, beralihlah ke pendekatan yang lebih baik (mis. IntelliJ IDEA, PhpStorm, Netbeans) atau ajukan permintaan fitur pada pelacak masalah produsen IDE Anda.
Terima kasih kepada Christian Weiss (dari Jerman) karena menjadi pelatih saya dan karena mengajari saya hal-hal hebat. PS: Temui saya dan dia di XING.