2012-10-03 50 views
5

Câu hỏi thẳng về phía trước ở đây. Đã tìm kiếm trên một số mã và tôi đã nhìn thấy một chức năng mà dường như để chuyển đổi một biến cho một boolean. Nó như sau:PHP chuyển đổi sang boolean bằng '!!'

function to_bool($var) { 
    return !!$var; 
} 

Khá đơn giản, nhưng nó hoạt động như thế nào? Chưa bao giờ thấy điều này trước đây, và googling đã không thực sự nhận được tôi bất cứ nơi nào. Có thêm '!' loại lật kết quả? '! $ var' có thể được sử dụng để kiểm tra xem var có sai không, do đó, '!!' biến 'false' thành true và ngược lại?

+0

bạn đã có nghĩa là '(bool) $ var;' bởi vì tôi chưa bao giờ thấy điều đó trước cả hai !! trước một biến – rsz

+2

'!' phủ nhận, vì vậy hai đôi phủ định, chuyển đổi bất cứ điều gì nó là boolean ... – jeremy

+0

Đôi âm bản, đã suy nghĩ đó. Rất kỳ quặc. Bạn có nghĩ rằng nó hoàn toàn đáng tin cậy không? –

Trả lời

9

cách hoạt động?

Toán tử không đặt biến vào điều kiện. Do đó, kết quả là boolean. Thứ hai không lật giá trị của nó.

Rõ ràng hơn chỉ để sử dụng một diễn viên rõ ràng trong mã của bạn chứ không phải là một chức năng như:

(bool)$var; 
+0

Để trở thành pedantic, nó là 'không' thứ hai trong chuỗi thời gian, hoặc 'không' thứ hai trong chuỗi vật lý, làm lật giá trị. –

+0

@Seth: Đúng vậy. Đó là cách tôi muốn nói. – webbiedave

3

Một ! sẽ là một boolean ngược để hai số !! tạo một boolean không đảo ngược. Đó là một phủ định kép của một biến và trở về như một loại boolean

3

Hãy !! 2

!2 đánh giá để !(true)

đó để đánh giá kết quả !false cuối true. Không boolean về cơ bản xử lý toán hạng bên phải như một bool.

2

Hmmm ... thú vị.

Vâng, PHP tuân theo một bộ quy tắc cụ thể khi xác định xem biến có "đúng" hay "sai" hay không.

Sử dụng một số nhà khai thác nhất định sẽ buộc phải đưa ra quyết định đó. Ví dụ: khi bạn thêm một chuỗi "a" và một số nguyên 2 với toán tử ., bạn sẽ nhận được "a2", vì mục đích của nhà điều hành . là ghép nối.

Ở đây, ! đầu tiên có nghĩa là bạn đang cố gắng từ chối biến. Để phủ nhận bất cứ điều gì có nghĩa là trước tiên bạn phải coi nó như là một boolean, vì vậy đó là những gì nó làm. Sau đó, ! thứ hai chỉ phủ nhận nó trở lại.

Đó là một cách làm lạ. Thành thật mà nói, if ($var) sẽ mang lại kết quả tương tự như if (to_bool($var)) của bạn.

+0

Bạn có nghĩ '!! $ var' sẽ là phương pháp kiểm tra nhanh hơn 'to_bool ($ var)' không? Chỉ cần ra khỏi tò mò thực sự! Rõ ràng là một sự khác biệt khá đáng kể nếu có! –

+0

'if ($ var)' là nhanh nhất, nhưng có, sự khác biệt sẽ không đáng kể. –

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