PHP adalah bahasa paradigma campuran, memungkinkan untuk menggunakan dan mengembalikan tipe data non-objek, seperti array. Saya mengajukan pertanyaan untuk mencoba memperjelas beberapa pedoman untuk pemilihan array vs objek ketika memutuskan apa yang membangun pemrograman untuk digunakan dalam situasi tertentu.
Ini benar-benar sebuah pertanyaan tentang cara untuk menyandikan data menggunakan konstruksi bahasa PHP dan ketika satu cara lebih mungkin diambil alih yang lain untuk keperluan penyampaian data (yaitu Arsitektur Berorientasi Layanan atau layanan web).
Contoh
Misalkan Anda memiliki jenis item yang terdiri dari {biaya, nama, part_number, item_count}. Program Anda meminta tampilan beberapa jenis item, ke tempat Anda memutuskan untuk menggunakan array sebagai wadah luar untuk menampung masing-masing jenis item. [Anda juga dapat menggunakan PHP adalah ArrayObject
untuk paradigma OO, tapi pertanyaan saya bukan tentang itu (luar) array yang]. Pertanyaan saya adalah tentang bagaimana menyandikan data jenis item, dan tentang paradigma mana yang digunakan. PHP memungkinkan Anda untuk menggunakan PHP Native Arrays
atau PHP Objects
.
Saya dapat menyandikan data seperti itu, dengan dua cara di sini, seperti:
//PHP's associative arrays:
$ret = array(
0 => array(
'cost' => 10.00,
'name' => 'item1',
'part_number' => 'zyz-100',
'item_count' => 15
),
1 => array(
'cost' => 34.00,
'name' => 'item2',
'part_number' => 'abc-230',
'item_count' => 42
),
);
vs.
//here ItemType is encapsulated into an object
$ret = array(
0 => new ItemType(10.00, 'item1', 'zyz-100', 15),
1 => new ItemType(34.00, 'item2', 'abc-230', 42),
);
class ItemType
{
private $price;
private $name;
private $partNumber;
private $itemCount;
function __construct($price, $name, $partNumber, $itemCount) {..}
}
Apa yang saya pikirkan
Pengkodean array ringan, dan lebih siap JSON, tetapi bisa lebih mudah kacau. Salah mengeja salah satu kunci array asosiatif dan Anda mungkin memiliki kesalahan yang lebih sulit ditangkap. Tetapi juga lebih mudah untuk berubah pada kemauan. Katakanlah saya tidak ingin menyimpan item_count
lagi, saya dapat menggunakan perangkat lunak pengolah teks untuk dengan mudah menghapus semua item_count
instance dalam array dan kemudian memperbarui fungsi-fungsi lain yang menggunakannya sesuai. Ini mungkin proses yang lebih membosankan, tetapi sederhana.
Pengkodean berorientasi objek memanggil fasilitas-fasilitas bahasa IDE dan PHP dan membuatnya lebih mudah untuk menangkap kesalahan sebelumnya, tetapi lebih sulit untuk memprogram dan membuat kode di tempat pertama. Saya katakan lebih keras, karena Anda harus berpikir sedikit tentang objek Anda, berpikir ke depan, dan OO coding membutuhkan beban kognitif yang sedikit lebih tinggi daripada mengetik struktur array. Yang mengatakan, setelah dikodekan, beberapa perubahan mungkin lebih mudah untuk diterapkan, dalam arti, bahwa menghapus item_count
, misalnya, akan membutuhkan lebih sedikit mengubah baris kode. Tetapi perubahan itu sendiri mungkin masih memerlukan muatan kognitif yang lebih tinggi dibandingkan dengan metode array, karena fasilitas OO tingkat tinggi terlibat.
Pertanyaan
Dalam beberapa kasus jelas, seperti kasus di mana saya perlu melakukan manipulasi pada data. Tetapi dalam beberapa kasus, di mana saya hanya perlu menyimpan beberapa baris data "Jenis Item", saya tidak memiliki pedoman atau pertimbangan yang jelas untuk bersandar ketika mencoba memutuskan apakah akan menggunakan array atau apakah akan membangun objek. Sepertinya saya bisa melempar koin dan mengambil satu. Apakah itu yang terjadi di sini?
array
, 2: User-defined Class
, 3: stdClass
. Kinerja dalam hal kecepatan hampir sama ketika membandingkan array
dan User-defined class
(seperti Anda ItemType
), tetapi class
biasanya cenderung menggunakan lebih sedikit memori daripada menggunakan array
s. stdClass
di sisi lain adalah yang paling lambat dari tiga opsi dan juga menggunakan sebagian besar memori.
(object)['foo'=>'bar']
. Nilai yang dihasilkan memiliki kelasStdClass
, akan dikodekan JSON secara keseluruhan olehjson_encode()
dan properti dapat diubah namanya semudah indeks array (yang tidak selalu begitu mudah, ketika itu diakses secara tidak langsung melalui variabel). Namun, ada operasi yang berbeda pada nilai-nilai tersebut; misalnya, Anda tidak memiliki serikat objek karena Anda memiliki serikat array, dan Anda tidak dapat langsung menggunakanarray_*()
fungsi.