PHP เป็นภาษากระบวนทัศน์ผสมอนุญาตให้ใช้และส่งคืนชนิดข้อมูลที่ไม่ใช่วัตถุเช่นอาร์เรย์ ฉันถามคำถามเพื่อพยายามอธิบายแนวทางบางอย่างสำหรับการเลือกอาร์เรย์กับวัตถุเมื่อตัดสินใจเลือกสิ่งที่โปรแกรมสร้างขึ้นเพื่อใช้ในสถานการณ์เฉพาะ
นี่เป็นคำถามเกี่ยวกับวิธีการเข้ารหัสข้อมูลโดยใช้การสร้างภาษา PHP และเมื่อมีวิธีหนึ่งที่น่าจะเลือกมากกว่าเพื่อการส่งผ่านข้อมูล (เช่น Service-Oriented Architecture หรือบริการบนเว็บ)
ตัวอย่าง
สมมติว่าคุณมีประเภทรายการประกอบด้วย {cost, name, part_number, item_count} โปรแกรมของคุณเรียกร้องให้แสดงประเภทรายการดังกล่าวหลายประเภทซึ่งคุณต้องการใช้อาร์เรย์เป็นที่เก็บด้านนอกเพื่อเก็บรายการแต่ละประเภทไว้ [คุณยังสามารถใช้ PHP เป็นArrayObject
สำหรับกระบวนทัศน์ OO แต่คำถามของฉันไม่เกี่ยวกับการที่ (นอก) อาร์เรย์] คำถามของฉันเกี่ยวกับวิธีเข้ารหัสข้อมูลประเภทรายการและเกี่ยวกับกระบวนทัศน์ที่จะใช้ PHP ช่วยให้คุณใช้หรือPHP Native Arrays
PHP Objects
ฉันสามารถเข้ารหัสข้อมูลดังกล่าวได้สองวิธีดังนี้:
//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) {..}
}
สิ่งที่ฉันคิด
การเข้ารหัสอาร์เรย์มีน้ำหนักเบาและพร้อมใช้งาน JSON มากขึ้น แต่สามารถทำให้ยุ่งได้ง่ายขึ้น Misspell หนึ่งในคีย์อาเรย์เชื่อมโยงและคุณอาจมีข้อผิดพลาดที่จับยากกว่า แต่มันก็ง่ายกว่าที่จะเปลี่ยนใจ ว่าฉันไม่ต้องการเก็บitem_count
อีกต่อไปฉันสามารถใช้ซอฟต์แวร์ประมวลผลข้อความใด ๆ เพื่อลบitem_count
อินสแตนซ์ทั้งหมดในอาเรย์แล้วอัปเดตฟังก์ชั่นอื่น ๆ ที่ใช้งานได้ตามนั้น อาจเป็นกระบวนการที่น่าเบื่อกว่า แต่ก็ง่าย
การเข้ารหัสเชิงวัตถุจะเรียกร้องสิ่งอำนวยความสะดวกด้านภาษาของ IDE และ PHP และทำให้ง่ายต่อการตรวจจับข้อผิดพลาดใด ๆ ก่อนหน้า แต่เป็นการยากที่จะเขียนโปรแกรมและเขียนโค้ดในตอนแรก ฉันพูดได้ยากขึ้นเพราะคุณต้องคิดเกี่ยวกับวัตถุของคุณคิดล่วงหน้าและการเข้ารหัส OO ต้องใช้ภาระการรับรู้สูงกว่าการพิมพ์โครงสร้างของอาร์เรย์ ที่กล่าวว่าเมื่อมีการเขียนโค้ดการเปลี่ยนแปลงบางอย่างอาจนำไปใช้ได้ง่ายขึ้นในแง่หนึ่งเช่นการลบออกitem_count
จะต้องเปลี่ยนรหัสบรรทัดน้อยลง แต่การเปลี่ยนแปลงตัวเองอาจยังต้องใช้ภาระการรับรู้สูงกว่าเมื่อเปรียบเทียบกับวิธีการเรียงลำดับเนื่องจากสิ่งอำนวยความสะดวก OO ระดับสูงมีส่วนเกี่ยวข้อง
คำถาม
ในบางกรณีมีความชัดเจนเช่นกรณีที่ฉันจะต้องทำการปรับเปลี่ยนข้อมูล แต่ในบางกรณีที่ฉันต้องเก็บข้อมูล "Item Type" สองสามบรรทัดฉันไม่มีแนวทางที่ชัดเจนหรือข้อควรพิจารณาที่จะพึ่งพาเมื่อพยายามตัดสินใจว่าจะใช้อาร์เรย์หรือว่าจะสร้างวัตถุ ดูเหมือนว่าฉันจะโยนเหรียญและเลือกหนึ่งเหรียญ เป็นกรณีนี้หรือไม่
array
, 2: User-defined Class
, 3: stdClass
ประสิทธิภาพในแง่ของความเร็วนั้นค่อนข้างเหมือนกันเมื่อเปรียบเทียบarray
และ a User-defined class
(เช่นของคุณItemType
) แต่class
es ที่กำหนดมักใช้หน่วยความจำน้อยกว่าการใช้array
s stdClass
ในขณะที่ช้าที่สุดในสามตัวเลือกและใช้หน่วยความจำมากที่สุด
(object)['foo'=>'bar']
คุณจะได้รับวัตถุที่มีน้ำหนักเบาโดยการหล่ออาร์เรย์วัตถุ: ค่าผลลัพธ์มีคลาสStdClass
จะถูกเข้ารหัส JSON อย่างครบถ้วนโดยjson_encode()
คุณสมบัติสามารถเปลี่ยนชื่อได้อย่างง่ายดายเหมือนกับดัชนีอาเรย์ (ซึ่งไม่ง่ายเสมอไปเมื่อเข้าถึงโดยอ้อมผ่านตัวแปร) อย่างไรก็ตามมีการดำเนินการที่แตกต่างกันในค่าดังกล่าว ตัวอย่างเช่นคุณไม่มีสหภาพวัตถุในขณะที่คุณมีสหภาพอาร์เรย์และคุณไม่สามารถใช้array_*()
ฟังก์ชันได้โดยตรง