2011-11-07 42 views
7

Mục tiêu của tôi là đặt một số logic phức tạp trong câu lệnh if(). Hãy nói rằng tôi có một mảng các giá trị và tôi sẽ thực hiện một chút mã nếu tất cả mọi thứ trong mảng của tôi là nonzero. Thông thường, tôi có thể nói, $valid = true, foreach mảng của tôi và đặt $valid = false khi tìm thấy số không. Sau đó, tôi sẽ chạy mã của tôi if ($valid). Ngoài ra, tôi có thể đặt vòng lặp của tôi vào một hàm và đặt hàm intop của tôi if().Đóng cửa PHP trong các câu lệnh IF là gì?

Nhưng tôi lười biếng, vì vậy tôi không muốn muck về với một loạt các lá cờ "hợp lệ", và tôi không muốn viết một chức năng hoàn toàn mới mà chỉ được sử dụng ở một nơi.

Vì vậy, chúng ta hãy nói rằng tôi có điều này:

if ($q = function() { return 'foo'; }) { 
    echo $q; 
} 
else { 
    echo 'false'; 
} 

Tôi đã mong rằng if được 'foo', mà trả về true. Việc đóng của tôi được cam kết là $q và tuyên bố sẽ thực hiện. $q trả về chuỗi foo và 'foo' được in.

Thay vào đó, tôi gặp lỗi Object of class Closure could not be converted to string.

Vì vậy, hãy thử loại này thay vì:

if (function() { return false; }) { 
    echo 'foo'; 
} 
else { 
    echo 'true'; 
} 

Tôi đã mong rằng chức năng của tôi sẽ trả về false và 'true' sẽ được in. Thay vào đó, 'foo' được in.

Điều gì sai về cách tôi thực hiện việc này? Có vẻ như nó đang nói, "Đúng, đó chắc chắn là một chức năng!" thay vì "Không, bởi vì hàm được đánh giá là sai". Có cách nào để làm những gì tôi đang cố gắng làm không?

+3

Bạn có vẻ nhầm lẫn các hàm với giá trị trả về của chúng. – delnan

+0

Tôi cho rằng điều tôi muốn gần hơn với 'if (function() {return false;}()) {' có vẻ hợp lệ trong Javascript chứ không phải PHP. – ajp5103

+0

http://stackoverflow.com/questions/3568410/anonymous-functions-that-execute-immediately call_user_func() là những gì tôi đang tìm kiếm. – ajp5103

Trả lời

4

function() { return false; } tạo ra một đối tượng kiểu Closure, tương tự như new với đẳng cấp các loại khác, so sánh đoạn mã sau:

$func = function() { return false; }; 

$func bây giờ là một đối tượng. Mỗi đối tượng trả về true trong mệnh đề if. Vì vậy,

if ($func) 
{ 
    # true 
} else { 
    # will never go here. 
} 

Bạn có thể muốn làm điều này thay vì:

if ($func()) 
{ 
    # true 
} else { 
    # false 
} 

mà sẽ gọi đối tượng Đóng $func và cung cấp cho nó là giá trị trả về.

3

Cả hai đều được đánh giá là đúng.

Bạn cần thực hiện chức năng để sử dụng hàm trong câu lệnh if.

Hãy thử điều này:

$q = function() { return false; }; 
if ($q()) { //should not go here. 
    echo $q(); 
} 
else { 
    echo 'false'; 
} 

Demo: http://codepad.viper-7.com/Osym1s

1

Bạn đang không thực hiện việc đóng cửa khi bạn gọi echo, do đó nó đang cố gắng để in ra việc đóng cửa, không phải là kết quả của việc đóng cửa:

echo $q(); 
0

Bạn đang tạo một chức năng ẩn danh, nhưng không bao giờ thực hiện nó . Khi bạn kiểm tra $q = function() { return 'foo'; }, điều bạn đang nói là "Chỉ định tham chiếu đến hàm ẩn danh này cho $ q và vượt qua bài kiểm tra này nếu $ q không phải là rỗng" (không phải là PHP vui vẻ?)

Bạn cần gọi việc đóng và gán kết quả của nó cho $q trước khi thử nghiệm và lặp lại $q.

2

Đóng cửa của PHP được triển khai như một đối tượng hack thuộc loại Closure. Mã của bạn thực sự khởi tạo một đối tượng của lớp này và gán nó cho $ q. Trong PHP, kết quả của bài tập là giá trị đang được gán, do đó, trong thực tế, bạn mã hóa xuống thành

if (new Closure()) { ... } 
Các vấn đề liên quan