Trong JavaScript, bạn có thể xác định các hàm ẩn danh được thực thi ngay lập tức:
(function () { /* do something */ })()
Bạn có thể làm điều gì đó tương tự trong PHP không?
Trong JavaScript, bạn có thể xác định các hàm ẩn danh được thực thi ngay lập tức:
(function () { /* do something */ })()
Bạn có thể làm điều gì đó tương tự trong PHP không?
Câu trả lời:
Đối với PHP7: xem câu trả lời của Yasuo Ohgaki :(function() {echo 'Hi';})();
Đối với các phiên bản trước: cách duy nhất để thực thi chúng ngay lập tức mà tôi có thể nghĩ đến là
call_user_func(function() { echo 'executed'; });
call_user_func
Trong PHP 7
là làm tương tự trong javascript
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;
Đầu ra là:
1
2
3
Tất nhiên bạn có thể sử dụng call_user_func
, nhưng vẫn có một giải pháp thay thế khá đơn giản khác:
<?php
// we simply need to write a simple function called run:
function run($f){
$f();
}
// and then we can use it like this:
run(function(){
echo "do something";
});
?>
run
hàm của bạn trong một số phần khác của mã vì không có xử lý nào đối với hàm của bạn tồn tại sau dòng ngay lập tức thực thi nó.
run()
là thực thi ngay lập tức hàm không tên được chuyển cho nó. Giống như call_user_func()
, chỉ không có tham số nào được truyền.
$f();
:) và có thể nhanh hơn nếu công cụ bạn sử dụng không tối ưu hóa cho trường hợp đặc biệt call_user_func
chỉ có một đối số hàm. Điều này là do call_user_func
hỗ trợ truyền nhiều tham số và đối số đầu tiên của nó hỗ trợ một chuỗi như một đối số hoặc một hàm. Điều đó nói rằng, nếu call_user_func
có thể đọc được nhiều, tôi sẽ không sử dụng run
trừ khi mã nằm ở đâu đó ở dưới cùng của pyramind .
run
và call_user_func
. call_user_func
có một bất lợi cố hữu khi so sánh với run
bởi vì run
chỉ làm một việc, trong khi call_user_func
hỗ trợ các tính năng bổ sung ngoài việc làm những gì run
. Bạn có thể thử kiểm tra vòng lặp nhanh ( ví dụ ) để xem động cơ của bạn chạy nhanh hơn.
Đây là cách đơn giản nhất cho PHP 7.0 trở lên.
php -r '(function() {echo 'Hi';})();'
Nó có nghĩa là tạo bao đóng, sau đó gọi nó dưới dạng hàm bằng cách theo sau "()". Hoạt động giống như JS nhờ thứ tự đánh giá biến đồng nhất.
Lưu ý, câu trả lời được chấp nhận là tốt nhưng phải mất 1,41 lần (chậm hơn 41%) so với việc khai báo một hàm và gọi nó trong hai dòng.
[Tôi biết đó không hẳn là một câu trả lời mới nhưng tôi cảm thấy việc thêm câu trả lời này vào đâu đó cho khách truy cập là rất có giá trị.]
Chi tiết:
<?php
# Tags: benchmark, call_user_func, anonymous function
require_once("Benchmark.php");
bench(array(
'test1_anonfunc_call' => function(){
$f = function(){
$x = 123;
};
$f();
},
'test2_anonfunc_call_user_func' => function(){
call_user_func(
function(){
$x = 123;
}
);
}
), 10000);
?>
Các kết quả:
$ php test8.php
test1_anonfunc_call took 0.0081379413604736s (1228812.0001172/s)
test2_anonfunc_call_user_func took 0.011472940444946s (871616.13432805/s)
Tôi đã thử theo cách này, nhưng nó dài dòng hơn câu trả lời hàng đầu bằng cách sử dụng bất kỳ toán tử (hoặc hàm) nào cho phép bạn xác định hàm trước:
$value = $hack == ($hack = function(){
// just a hack way of executing an anonymous function
return array(0, 1, 2, 3);
}) ? $hack() : $hack();
Đây không phải là một câu trả lời trực tiếp mà là một cách giải quyết. Sử dụng PHP> = 7. Định nghĩa một lớp ẩn danh với một phương thức được đặt tên và xây dựng lớp và gọi phương thức đó ngay lập tức.
$var = (new class() { // Anonymous class
function cool() { // Named method
return 'neato';
}
})->cool(); // Instantiate the anonymous class and call the named method
echo $var; // Echos neato to console.
call_user_func(function(){/* stuff */})
làm?