2012-07-07 27 views
19

Tôi đang kiểm tra Thư viện PHP chuẩn (SPL). Tôi chỉ sử dụng các mảng trước và bây giờ thấy rằng PHP có rất nhiều lớp tiêu chuẩn. Nhưng không có bất kỳ từ nào trong hướng dẫn sử dụng cho dù nó được khuyến khích sử dụng nó hay không. Ví dụ: họ khuyên bạn nên sử dụng cấu trúc foreach để lặp mảng vì nó nhanh hơn. Còn thư viện này thì sao? Nếu tôi cần phải lưu trữ một số dữ liệu trong một đối tượng nên tôi sử dụng một số lớp SPL cụ thể cho tình hình của tôi hoặc sử dụng mảng tiêu chuẩn là tốt hơn không?PHP SPL, là nó có giá trị sử dụng hoặc chức năng mảng nguyên là tốt hơn?

+1

Nếu bạn lưu trữ dữ liệu trong một đối tượng, bạn có thể lặp qua đối tượng bằng cách triển khai ArrayAccess hoặc ArrayIterator, nhưng dữ liệu cơ bản vẫn được lưu trữ trong một mảng PHP cũ. Các mảng thông thường là tốt, nếu bạn muốn lưu trữ dữ liệu trong một đối tượng, hãy thực hiện một trong các [Iterator] (http://www.php.net/manual/en/spl.iterators.php) theo ý của bạn. – drew010

Trả lời

28

Có rất nhiều câu hỏi của bạn. Bạn có nên sử dụng cấu trúc dữ liệu SPL không? Nó phụ thuộc.

Mảng PHP có thể hoạt động như một bản đồ, một danh sách liên kết hoặc một mảng. Rất hiếm khi bạn thực sự muốn một kiểu dữ liệu duy nhất hoạt động như tất cả những thứ đó cùng một lúc, vì vậy bản chất tập trung của các kiểu dữ liệu SPL không quá hạn chế. Trong thực tế, hầu hết "người ngoài" (và một số "người trong cuộc") sẽ xem xét mảng của PHP là một trò hề.

Hạn chế chính đối với mảng của PHP là nó sử dụng nhiều bộ nhớ. Thậm chí nếu bạn chỉ muốn một mảng cố định, tuần tự, được lập chỉ mục, bạn có toàn bộ các thứ được liên kết với nhau và lưu trữ cho các khóa. Mặc dù vậy, mảng của PHP thường nhanh hơn nhiều so với các kiểu đối tượng nếu bạn chủ yếu gắn thêm dữ liệu và lặp lại nó, có thể vì hàm gọi các thứ chậm lại.

Nói chung, tôi không thấy nhiều người sử dụng cấu trúc dữ liệu SPL. Chủ yếu, tôi nghĩ, bởi vì trong bối cảnh của PHP và các ứng dụng web nói chung chúng không được áp dụng rất nhiều. Bạn thường xử lý các mảng nhỏ, nơi thuận tiện của các toán tử dựng sẵn và các hàm mảng lớn hơn bất kỳ ưu điểm nào của các kiểu SPL.

Điều đó nói rằng:

  • Nếu bạn thấy mình trong một tình huống mà bạn đang sử dụng một mảng như một danh sách liên kết (chèn/xóa ở giữa), sau đó thử một trong những SPL danh sách gấp đôi được liên kết.

  • Nếu bạn thấy mình sử dụng một mảng được lập chỉ mục lớn, hãy thử SPLFixedArray. Họ chắc chắn sẽ tiêu thụ ít bộ nhớ hơn.

  • Nếu bạn cần bản đồ có đối tượng làm khóa, hãy sử dụng SplObjectStorage (vì mảng PHP không hoạt động với khóa đối tượng).

  • Nếu bạn muốn giữ dữ liệu được sắp xếp trong một mảng, hãy thử một trong các vùng.

Đo điểm chuẩn mảng gốc so với đối tượng SPL và sử dụng tùy chọn nào có bộ nhớ + tốc độ + sự cân bằng đơn giản phù hợp với bạn.

+1

+1, nhưng tôi sẽ nói với tôi, tôi luôn luôn hướng tới mảng bản địa php đơn giản chỉ vì họ có tích hợp ngôn ngữ tuyệt vời và làm việc với tất cả các chức năng mảng tuyệt vời của php. spl thường cảm thấy như một misfit trong php. – goat

+0

Tôi đồng ý rằng những cấu trúc dữ liệu này có xu hướng dính ra như một ngón tay cái đau. Tôi thường chỉ sử dụng chúng khi crunching rất nhiều dữ liệu (và thậm chí sau đó, PHP không phải là lựa chọn đầu tiên của tôi về một ngôn ngữ) hoặc khi tôi cần phải vượt qua mảng bằng cách tham khảo. – Matthew

Các vấn đề liên quan