PHP là một ngôn ngữ mô hình hỗn hợp, cho phép sử dụng và trả về các kiểu dữ liệu không phải đối tượng, chẳng hạn như mảng. Tôi đặt ra một câu hỏi để cố gắng làm rõ một số hướng dẫn để lựa chọn mảng so với các đối tượng khi quyết định sử dụng cấu trúc lập trình nào để sử dụng trong một tình huống cụ thể.
Đây thực sự là một câu hỏi về cách mã hóa dữ liệu bằng các cấu trúc ngôn ngữ PHP và khi một cách có nhiều khả năng được chọn hơn một cách khác cho mục đích truyền dữ liệu (ví dụ: Kiến trúc hướng dịch vụ hoặc dịch vụ web).
Thí dụ
Giả sử bạn có một loại mặt hàng bao gồm {chi phí, tên, part_number, item_count}. Chương trình của bạn yêu cầu hiển thị một số loại mặt hàng như vậy, đến nơi bạn quyết định sử dụng một mảng làm thùng chứa bên ngoài để giữ từng loại mặt hàng. [Bạn cũng có thể sử dụng PHP là ArrayObject
cho OO mô hình, nhưng câu hỏi của tôi không phải là về đó (bên ngoài) mảng]. Câu hỏi của tôi là về cách mã hóa dữ liệu loại mặt hàng và về mô hình sử dụng. PHP cho phép bạn sử dụng PHP Native Arrays
hoặc PHP Objects
.
Tôi có thể mã hóa dữ liệu đó, theo hai cách ở đây, như vậy:
//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
),
);
đấu với
//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) {..}
}
Tôi đang nghĩ gì
Mã hóa mảng có trọng lượng nhẹ và sẵn sàng JSON hơn, nhưng có thể dễ gây rối hơn. Bỏ lỡ một trong các khóa mảng kết hợp và bạn có thể gặp lỗi khó bắt hơn. Nhưng nó cũng dễ dàng hơn để thay đổi bất chợt. Nói rằng tôi không muốn lưu trữ item_count
nữa, tôi có thể sử dụng bất kỳ phần mềm xử lý văn bản nào để dễ dàng xóa tất cả các item_count
phiên bản trong mảng và sau đó cập nhật các chức năng khác sử dụng nó cho phù hợp. Nó có thể là một quá trình tẻ nhạt hơn, nhưng nó đơn giản.
Mã hóa hướng đối tượng gọi các phương tiện ngôn ngữ IDE và PHP và giúp dễ dàng bắt được bất kỳ lỗi nào trước đó, nhưng khó lập trình và mã hóa ngay từ đầu. Tôi nói khó hơn, bởi vì bạn phải suy nghĩ một chút về các đối tượng của mình, suy nghĩ trước và mã hóa OO có tải nhận thức cao hơn một chút so với việc gõ các cấu trúc mảng. Điều đó nói rằng, một khi nó được mã hóa, một số thay đổi có thể dễ thực hiện hơn, theo một nghĩa nào đó, việc xóa item_count
, chẳng hạn, sẽ yêu cầu thay đổi ít dòng mã hơn. Nhưng bản thân các thay đổi vẫn có thể yêu cầu tải nhận thức cao hơn so với phương pháp mảng, vì các cơ sở OO cấp cao hơn có liên quan.
Câu hỏi
Trong một số trường hợp thì rõ ràng, giống như các trường hợp tôi sẽ cần phải thực hiện các thao tác trên dữ liệu. Nhưng trong một số trường hợp, khi tôi chỉ cần lưu trữ một vài dòng dữ liệu "Loại vật phẩm", tôi không có hướng dẫn hoặc cân nhắc rõ ràng để dựa vào khi cố gắng quyết định nên sử dụng mảng hay có nên xây dựng các đối tượng hay không. Có vẻ như tôi chỉ có thể tung đồng xu và chọn một đồng. Có phải đó là trường hợp ở đây?
array
, 2 : User-defined Class
, 3 : stdClass
. Hiệu suất về tốc độ khá giống nhau khi so sánh array
và một User-defined class
(chẳng hạn như của bạn ItemType
), nhưng class
es được xác định có xu hướng sử dụng ít bộ nhớ hơn so với sử dụng array
s. stdClass
mặt khác là chậm nhất trong ba tùy chọn và cũng sử dụng nhiều bộ nhớ nhất.
(object)['foo'=>'bar']
. Giá trị kết quả có lớpStdClass
, sẽ được mã hóa toàn bộ JSONjson_encode()
và các thuộc tính có thể được đổi tên dễ dàng như các chỉ số mảng (không phải lúc nào cũng dễ dàng, khi nó được truy cập gián tiếp thông qua một biến). Tuy nhiên, có các hoạt động khác nhau trên các giá trị đó; ví dụ: bạn không có các hiệp hội đối tượng vì bạn có các hiệp hội mảng và bạn không thể trực tiếp sử dụng cácarray_*()
hàm.