Chúng có giải pháp thực sự trong PHP 7.1.
http://php.net/manual/en/migration71.new-features.php#migration71.new-features.iterable-pseudo-type
Các iterable pseudo-type là những gì bạn muốn. Bất kỳ mảng hoặc kiểu Traversable nào, (là giao diện cơ bản cho Iterator) sẽ vượt qua kiểm tra này.
Bây giờ, để làm rõ điều này cho bất kỳ ai muốn có siêu sâu, có, sẽ có các trường hợp cạnh. Bạn nên suy nghĩ về những trường hợp cạnh và tự giải quyết chúng, nhưng nếu bạn muốn chắc chắn rằng nếu ai đó vượt qua trong một yếu tố đi qua không thể truy cập thông qua một khóa, bạn có thể làm điều này.
http://php.net/manual/en/function.iterator-to-array.php
Bây giờ bất kể những gì họ vượt qua trong các loại-gợi ý, bạn sẽ có một mảng, nhưng điều này có thể loại bỏ những lợi ích của việc sử dụng một máy phát điện để giảm bộ nhớ. Nó nên rõ ràng, nhưng rõ ràng nó không phải là, vì vậy ở đây nó được. Bạn, lập trình viên, chịu trách nhiệm tìm ra các trường hợp sử dụng cụ thể của bạn cho mã và cách bạn đang lập kế hoạch sử dụng mã đó và trường hợp sử dụng thích hợp là gì đối với mã.
Vì điều này vẫn chưa đủ rõ ràng, giả sử bạn đang cố truyền đạt thứ gì đó có thể gợi ý và mong đợi một phương thức hoặc biến cụ thể tồn tại, khi đó bạn đang lập trình kém. Bạn nên triển khai hợp đồng có loại trả về bạn đang tìm và chuyển loại đó thay vì loại chung. Nếu bạn chỉ muốn làm một cái gì đó chung chung như looping, đó là những gì các loại iterable được cho. Gợi ý có trong tên: Iterate.
Nguồn
2017-01-07 04:40:13
Không phải câu trả lời tôi hy vọng nhưng việc truyền tới một mảng thực sự là một ý tưởng hay. Cảm ơn – Supericy
Đây là một thực tế không tốt, một khách hàng không nên làm những gì thư viện có thể làm. – danidacar
Việc đưa một đối tượng vào mảng không quan tâm ArrayAccess có được triển khai hay không. AFAIK điều duy nhất sẽ thay đổi chức năng đúc là phân lớp lớp ArrayObject. Hy vọng rằng https://wiki.php.net/rfc/union_types làm cho nó trong một ngày nào đó (không liên quan đến đúc rõ ràng, nhưng với câu hỏi của OP);) –