PHP, diziler gibi nesne olmayan veri türlerinin kullanılmasına ve döndürülmesine izin veren karma bir paradigma dilidir. Belirli bir durumda hangi programlama yapısının kullanılacağına karar verirken, dizilerin veya nesnelerin seçilmesiyle ilgili bazı yönergeleri netleştirmeye çalışıyorum.
Bu, PHP dili yapıları kullanarak verileri kodlamanın yolları hakkında ve bir yolun veri aktarma amacıyla (örneğin Servis Odaklı Mimari veya web servisleri) başka bir yoldan daha fazla seçilmesi gerektiğiyle ilgili bir sorudur.
Örnek
{Cost, name, part_number, item_count} 'dan oluşan bir öğe türünüz olduğunu varsayalım. Programınız, her bir öğe türünü tutmak için dış kap olarak bir dizi kullanmaya karar verdiğiniz, bu tür birkaç öğe türünün görüntülenmesini gerektirir. [Ayrıca PHP var kullanabilirsiniz ArrayObject
OO paradigma için değil, benim sorum ilgili değil bu (dış) diziden]. Sorum, madde tipi verilerinin nasıl kodlanacağı ve hangi paradigmanın kullanılacağı ile ilgili. PHP kullanmanıza izin verir PHP Native Arrays
veya PHP Objects
.
Bu gibi verileri burada iki şekilde kodlayabilirim:
//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) {..}
}
Ne düşünüyorum
Dizi kodlaması hafif ve daha JSON'a hazır, ancak karışıklık yaratması daha kolay olabilir. İlişkisel dizi tuşlarından birini yanlış yazdığınızda, yakalanması daha zor bir hata olabilir. Ancak bir hevesle değiştirmek de daha kolaydır. item_count
Artık depolamak istemediğimi söyleyin item_count
, dizideki tüm örnekleri kolayca kaldırmak ve ardından onu kullanan diğer işlevleri güncellemek için herhangi bir metin işleme yazılımını kullanabilirim. Daha sıkıcı bir süreç olabilir, ama basittir.
Nesneye yönelik kodlama IDE ve PHP dil olanaklarını çağırır ve önceden herhangi bir hatayı yakalamayı kolaylaştırır, ancak ilk başta programlamak ve kodlamak daha zordur. Daha sert diyorum, çünkü nesneleriniz hakkında biraz düşünmek zorundasınız, ileriyi düşünün ve OO kodlaması dizi yapılarını yazmaktan biraz daha yüksek bilişsel yük alır. Bununla birlikte, bir kez kodlandıktan sonra, bazı değişikliklerin uygulanması, belki de bir anlamda, item_count
örneğin daha az kod satırının değiştirilmesini gerektirecek şekilde daha kolay olabilir. Ancak, değişikliklerin kendileri, daha yüksek OO tesisleri söz konusu olduğundan, dizi yöntemine kıyasla daha yüksek bir bilişsel yük gerektirebilir.
Soru
Bazı durumlarda, verilerde manipülasyon yapmak zorunda kalacağım durumlar gibi açıktır. Ancak bazı durumlarda, yalnızca "Item Type" verisi satırlarını depolamam gereken bazı durumlarda, dizileri kullanıp kullanmayacağınıza veya nesneler oluşturup oluşturmayacağınıza karar verirken, üzerine eğilmek için net yönergelerim veya düşüncelerim yok. Görünüşe bakılırsa yazı tura atıp bir tane seçebilirim. Buradaki durum bu mu?
array
, 2: User-defined Class
, 3: stdClass
. Hız açısından performans karşılaştırırken array
ve bir User-defined class
(sizin gibi ItemType
) hemen hemen aynıdır , ancak tanımlanmış class
es array
s kullanmaktan daha az bellek kullanma eğilimindedir . stdClass
Öte yandan, üç seçeneğin en yavaş olanıdır ve aynı zamanda en çok belleği kullanır.
(object)['foo'=>'bar']
. Elde edilen değer sınıfa sahiptirStdClass
, JSON bütünüyle tarafından kodlanacaktırjson_encode()
ve özellikler, dizi indeksleri kadar kolay bir şekilde yeniden adlandırılabilir (bu, bir değişken aracılığıyla dolaylı olarak erişildiğinde her zaman bu kadar kolay değildir). Ancak, bu değerler üzerinde farklı işlemler var; örneğin, dizi sendikalarınız olduğu için nesne sendikalarınız yoktur vearray_*()
işlevleri doğrudan kullanamazsınız .