2010-08-30 24 views
11

Sử dụng PHP, có chức năng/phương pháp/cách để kiểm tra xem biến có chứa thứ gì đó an toàn để đưa vào cấu trúc foreach không? Một cái gì đó nhưCó cách nào để kiểm tra biến cho "isForEachable"

//the simple case, would probably never use it this bluntly 
function foo($things) 
{ 
    if(isForEachable($things)) 
    { 
     foreach($things as $thing) 
     { 
      $thing->doSomething(); 
     } 
    } 
    else 
    { 
     throw new Exception("Can't foreach over variable"); 
    } 
} 

Nếu câu trả lời của bạn là "thiết lập trình xử lý để bắt lỗi PHP", nỗ lực của bạn được đánh giá cao, nhưng tôi đang tìm kiếm một thứ khác.

+1

liên quan: http://stackoverflow.com/questions/3584700/iterable-objects-and-array-type- hinting/ – quantumSoup

Trả lời

15

Vâng, loại. Bạn có thể làm:

if (is_array($var) || ($var instanceof Traversable)) { 
    //... 
} 

Tuy nhiên, điều này không đảm bảo vòng lặp foreach sẽ thành công. Nó có thể ném một ngoại lệ hoặc thất bại âm thầm. Lý do là một số đối tượng có thể lặp lại, tại một số điểm, có thể không có bất kỳ thông tin nào để sinh lợi (ví dụ, chúng đã được lặp lại và nó chỉ có ý nghĩa để lặp lại chúng một lần).

Xem Traversable. Mảng không phải là đối tượng và do đó không thể triển khai giao diện như vậy (chúng có sẵn trước đó), nhưng chúng có thể đi qua trong vòng lặp foreach.

+0

ví dụ: DOMNodeList cũng là một đối tượng với phương thức riêng của nó nhưng lạ lùng tương thích với foreach của nó và is_array của nó (...). – thevikas

+0

lưu ý rằng các đối tượng cũng không được phép, vì vậy bạn có thể muốn thêm '|| is_object ($ var) 'với điều kiện. – jchook

-2

Kiểm tra sử dụng is_array

if(is_array($things)) 
     echo "it is foreachable"; 
else 
     echo "Not it's not foreachable."; 
+0

bạn có thể tìm kiếm các đối tượng quá – Galen

+0

Vòng lặp 'foreach' hỗ trợ nhiều hơn mảng. – Artefacto

+0

Cảm ơn bạn đã xóa thông tin đó. Xin lỗi, tôi xấu. Tôi không sử dụng PHP OOP nhiều. – shamittomar

0

Vì tất cả các đối tượng và mảng là "foreachable" trong PHP 5 + ...

function is_foreachable($var) { 
    return is_array($var) || is_object($var); 
} 
Các vấn đề liên quan