ใน JavaScript คุณสามารถกำหนดฟังก์ชันที่ไม่ระบุชื่อที่เรียกใช้งานได้ทันที:
(function () { /* do something */ })()
คุณสามารถทำสิ่งนั้นใน PHP ได้หรือไม่?
ใน JavaScript คุณสามารถกำหนดฟังก์ชันที่ไม่ระบุชื่อที่เรียกใช้งานได้ทันที:
(function () { /* do something */ })()
คุณสามารถทำสิ่งนั้นใน PHP ได้หรือไม่?
คำตอบ:
สำหรับ PHP7: ดูคำตอบของ Yasuo Ohgaki :(function() {echo 'Hi';})();
สำหรับเวอร์ชันก่อนหน้า: วิธีเดียวที่จะดำเนินการได้ทันทีที่ฉันคิดได้คือ
call_user_func(function() { echo 'executed'; });
call_user_func
ในPHP 7
คือการทำเช่นเดียวกันในจาวาสคริปต์
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;
ผลลัพธ์คือ:
1
2
3
แน่นอนว่าคุณสามารถใช้ได้call_user_func
แต่ยังมีอีกทางเลือกง่ายๆ:
<?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
ใช้ฟังก์ชันของคุณในส่วนอื่น ๆ ของโค้ดได้เนื่องจากไม่มีหมายเลขอ้างอิงสำหรับฟังก์ชันของคุณที่มีอยู่หลังบรรทัดซึ่งเรียกใช้งานทันที
run()
คือการเรียกใช้ฟังก์ชันที่ไม่มีชื่อส่งผ่านไปยังมันทันที เช่นเดียวกับcall_user_func()
ไม่มีการส่งผ่านพารามิเตอร์
$f();
และอาจเร็วกว่าหากเอ็นจิ้นที่คุณใช้ไม่ได้ปรับให้เหมาะสมสำหรับกรณีพิเศษที่call_user_func
มีอาร์กิวเมนต์ของฟังก์ชันเพียงตัวเดียว เนื่องจากcall_user_func
รองรับการส่งผ่านพารามิเตอร์หลายตัวและอาร์กิวเมนต์แรกรองรับสตริงเป็นอาร์กิวเมนต์หรือฟังก์ชัน ที่กล่าวว่าถ้าcall_user_func
อ่านได้มากฉันจะไม่ใช้run
เว้นแต่รหัสจะอยู่ที่ด้านล่างของปิรามินด์
run
และcall_user_func
. call_user_func
มีข้อเสียโดยธรรมชาติเมื่อเทียบกับrun
เพราะrun
ทำเพียงสิ่งเดียวในขณะที่call_user_func
รองรับคุณสมบัติเพิ่มเติมนอกเหนือจากการทำในสิ่งที่run
ทำ คุณสามารถลองทดสอบการวนซ้ำอย่างรวดเร็ว ( เช่น ) เพื่อดูว่าเครื่องยนต์ของคุณเร็วขึ้น
นี่เป็นวิธีที่ง่ายที่สุดสำหรับ PHP 7.0 หรือใหม่กว่า
php -r '(function() {echo 'Hi';})();'
หมายถึงสร้างการปิดจากนั้นเรียกมันว่าฟังก์ชันตาม "()" ทำงานเหมือนกับ JS ด้วยลำดับการประเมินตัวแปรที่เหมือนกัน
(new ReflectionFunction(function() {
// body function
}))->invoke();
หมายเหตุคำตอบที่ยอมรับนั้นใช้ได้ แต่ใช้เวลานานถึง 1.41 เท่า (ช้ากว่า 41%) กว่าการประกาศฟังก์ชันและเรียกมันเป็นสองบรรทัด
[ฉันรู้ว่ามันไม่ใช่คำตอบใหม่ แต่ฉันรู้สึกว่ามันมีค่าที่จะเพิ่มสิ่งนี้ให้กับผู้เยี่ยมชมที่ไหนสักแห่ง]
รายละเอียด:
<?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);
?>
ผล:
$ php test8.php
test1_anonfunc_call took 0.0081379413604736s (1228812.0001172/s)
test2_anonfunc_call_user_func took 0.011472940444946s (871616.13432805/s)
ฉันลองวิธีนี้แล้ว แต่มันละเอียดกว่าคำตอบด้านบนโดยใช้ตัวดำเนินการ (หรือฟังก์ชัน) ใด ๆ ที่ให้คุณกำหนดฟังก์ชันก่อน:
$value = $hack == ($hack = function(){
// just a hack way of executing an anonymous function
return array(0, 1, 2, 3);
}) ? $hack() : $hack();
นี่ไม่ใช่คำตอบโดยตรง แต่เป็นวิธีแก้ปัญหาชั่วคราว การใช้ PHP> = 7 การกำหนดคลาสที่ไม่ระบุชื่อด้วยเมธอดที่ตั้งชื่อและสร้างคลาสและเรียกใช้เมธอดทันที
$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.
ไม่ได้ดำเนินการในทันที แต่ใกล้เคียงกับ;)
<?php
$var = (function(){ echo 'do something'; });
$var();
?>
call_user_func(function(){/* stuff */})
ทำอย่างไร?