2008-09-28 27 views
6

Có thể viết một lớp mà hầu như không thể phân biệt được với một mảng PHP thực tế bằng cách thực hiện tất cả các giao diện SPL cần thiết không? Họ có thiếu bất cứ thứ gì quan trọng không?SPL của PHP: Các giao diện của nó có liên quan đến mảng bao gồm tất cả các thuộc tính mảng không?

Tôi muốn xây dựng một đối tượng Array cao cấp hơn, nhưng tôi muốn chắc chắn rằng tôi sẽ không phá vỡ một ứng dụng hiện có sử dụng mảng ở khắp mọi nơi nếu tôi thay thế chúng bằng một lớp Array tùy chỉnh.

Trả lời

7

Vấn đề duy nhất tôi có thể nghĩ đến là các hàm gettype() và is_array(). Kiểm tra mã của bạn cho

gettype($FakeArray) == 'array' 
is_array($FakeArray) 

Bởi vì mặc dù bạn có thể sử dụng đối tượng giống như một mảng, nó sẽ vẫn được xác định là một đối tượng.

+2

Thậm chí sau đó, có vẻ như tôi có thể sử dụng override_function() để ghi đè lên những chức năng để giải thích cho trường hợp bổ sung. – Wilco

3

Sự khác biệt khác bao gồm toán tử '+' đối với mảng (hợp nhất) và lỗi của toàn bộ các hàm array_*, bao gồm cả thường được sử dụng array_mergearray_shift.

4

Ngoài các điểm đã nêu ở trên, bạn sẽ không thể đưa ra gợi ý loại mảng không gian người dùng làm việc với các phiên bản của lớp học của bạn. Ví dụ:

<?php 
function f(array $a) { /*...*/ } 

$ao = new ArrayObject(); 
f($ao); //error 
?> 

Output:

Catchable fatal error: Argument 1 passed to f() must be an array, object given 
Các vấn đề liên quan