जावास्क्रिप्ट में, आप उन अनाम कार्यों को परिभाषित कर सकते हैं जिन्हें तुरंत निष्पादित किया जाता है:
(function () { /* do something */ })()
क्या आप PHP में ऐसा कुछ कर सकते हैं?
जावास्क्रिप्ट में, आप उन अनाम कार्यों को परिभाषित कर सकते हैं जिन्हें तुरंत निष्पादित किया जाता है:
(function () { /* do something */ })()
क्या आप PHP में ऐसा कुछ कर सकते हैं?
जवाबों:
PHP7 के लिए: यासुओ ओहगाकी का जवाब देखें :(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';})();'
इसका मतलब है क्लोजर बनाएं, फिर इसे "()" फॉलो करके फंक्शन के रूप में कहें। जेएस की तरह ही काम करता है एक समान चर मूल्यांकन आदेश के लिए धन्यवाद।
(new ReflectionFunction(function() {
// body function
}))->invoke();
ध्यान दें, स्वीकृत उत्तर ठीक है लेकिन किसी फ़ंक्शन को घोषित करने और उसे दो पंक्तियों में कॉल करने की तुलना में 1.41x लंबा (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.
call_user_func(function(){/* stuff */})
है?