मैं तुरंत PHP में एक अनाम फ़ंक्शन को कैसे निष्पादित करूं?


96

जावास्क्रिप्ट में, आप उन अनाम कार्यों को परिभाषित कर सकते हैं जिन्हें तुरंत निष्पादित किया जाता है:

(function () { /* do something */ })()

क्या आप PHP में ऐसा कुछ कर सकते हैं?


2
मेरे पास php 5.3 नहीं है मेरे हाथ पर बाहर की कोशिश करने के लिए, लेकिन यह कैसे करता call_user_func(function(){/* stuff */})है?
जसपुर

जवाबों:


121

PHP7 के लिए: यासुओ ओहगाकी का जवाब देखें :(function() {echo 'Hi';})();

पिछले संस्करणों के लिए: उन्हें तुरंत निष्पादित करने का एकमात्र तरीका मैं सोच सकता हूं

call_user_func(function() { echo 'executed'; });

12
जब तक (या, जब तक) फंक्शन कॉल चेनिंग शुरू नहीं हो जाता है, यह मेरा सुझाव भी होगा।
सालिटेह

2
@ गॉर्डन: php 5.4 अभी भी कुछ भी नहीं है?
गतिशील

@ हां123 ना। अभी भी उपयोग करना हैcall_user_func
गॉर्डन

2
@BennettMcElwee इसे इस तरह से रखें: भले ही यह परिभाषित-असाइन-कॉल विकल्प की तुलना में कुछ धीमा प्रदर्शन करता है, आपके आवेदन में एक महत्वपूर्ण अड़चन डालने की संभावना बहुत कम है। जब संदेह में अपने एप्लिकेशन को वास्तविक दुनिया की स्थितियों के तहत प्रोफाइल।
गॉर्डन

धन्यवाद @Gordon, यही मैंने सोचा है। मुझे यह आभास हुआ कि सलाथे और हां123 इस विधि से खुश नहीं थे, और मुझे आश्चर्य हुआ कि क्यों। मुझे पूरी तरह से ठीक लगता है।
बेनेट मैकलेवे

28

में 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

15

बेशक आप उपयोग कर सकते हैं 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";
});

?>

1
मैं तुरंत निष्पादन कार्य करना चाहता हूं, क्योंकि मैं जिस फ़ंक्शन को परिभाषित कर रहा हूं वह एक है जिसे SHOULDN'T को सामान्य निष्पादन में एक से अधिक बार कहा जाता है। एक नामित फ़ंक्शन, रन () को परिभाषित करने की समस्या, जैसे आपके पास है, यह है कि कोड को देखने वाला कोई अन्य व्यक्ति सोच सकता है कि वे कोड के किसी अन्य भाग में भी रन () कॉल कर सकते हैं। तत्काल-निष्पादित फ़ंक्शन यह स्पष्ट करता है कि इस कोड को दो बार नहीं चलाया जाना चाहिए।
डैनियल हॉवर्ड

3
वे runकोड के किसी अन्य भाग में आपके फ़ंक्शन पर कॉल नहीं कर सकते क्योंकि लाइन के बाद आपके फ़ंक्शन को कोई भी हैंडल मौजूद नहीं है जो तुरंत इसे निष्पादित करता है।
पचेरियर

3
@DanielHoward का बिंदु run()तुरंत उस अनाम फ़ंक्शन को निष्पादित करना है जो उसके पास है। उसी के रूप में call_user_func(), केवल कोई पैरामीटर पारित नहीं किया जाता है।
साइफर

1
@JordanLev, इसका एक सरल कार्यान्वयन है (बस एक पंक्ति:) $f();और तेज हो सकता है यदि आप जिस इंजन का उपयोग करते हैं वह उस विशेष मामले के लिए अनुकूलन नहीं करता है जहां call_user_funcकेवल एक फ़ंक्शन तर्क है। ऐसा इसलिए है क्योंकि call_user_funcकई मापदंडों को पारित करने का समर्थन करता है और यह पहला तर्क है या तो एक स्ट्रिंग को एक तर्क या फ़ंक्शन के रूप में समर्थन करता है। उस ने कहा, अगर call_user_funcबहुत पठनीय है, मैं उपयोग नहीं करूंगा runजब तक कि कोड पिरामिड के निचले भाग में कहीं स्थित न हो ।
पेसरियर

1
@JordanLev, "सरल कार्यान्वयन" कार्यों के अंदर कोड के बीच तुलना करने के लिए संदर्भित करता है runऔर call_user_funccall_user_funcइसकी तुलना में एक अंतर्निहित नुकसान होता है runक्योंकि runकेवल एक ही चीज़ करता है, जबकि call_user_funcक्या runकरता है इसके अलावा अतिरिक्त सुविधाओं का समर्थन करता है। आप यह देखने के लिए एक त्वरित लूप टेस्ट ( जैसे ) की कोशिश कर सकते हैं जो आपके इंजन पर तेज़ है।
पचेरियर

11

यह PHP 7.0 या उसके बाद के लिए सबसे सरल है।

php -r '(function() {echo 'Hi';})();'

इसका मतलब है क्लोजर बनाएं, फिर इसे "()" फॉलो करके फंक्शन के रूप में कहें। जेएस की तरह ही काम करता है एक समान चर मूल्यांकन आदेश के लिए धन्यवाद।

https://3v4l.org/06EL3


2
अच्छा उत्तर, लेकिन आप इसे कमांड लाइन ऑपरेशन के रूप में क्यों प्रारूपित करते हैं?
कोडोस जॉनसन

6
(new ReflectionFunction(function() {
 // body function
}))->invoke();

6
क्या आप अधिक विवरण प्रदान कर सकते हैं? शायद एक स्पष्टीकरण जोड़ें?
मोरालकोड 21

2

ध्यान दें, स्वीकृत उत्तर ठीक है लेकिन किसी फ़ंक्शन को घोषित करने और उसे दो पंक्तियों में कॉल करने की तुलना में 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)

0

मैंने इसे इस तरह आज़माया, लेकिन यह किसी भी ऑपरेटर (या फ़ंक्शन) का उपयोग करके शीर्ष उत्तर से अधिक क्रिया है जो आपको पहले फ़ंक्शन को परिभाषित करने की अनुमति देता है:

    $value = $hack == ($hack = function(){
            // just a hack way of executing an anonymous function
            return array(0, 1, 2, 3);                
    }) ? $hack() : $hack();

2
फिर बस क्यों नहीं $hack = function(){...}; $hack()?

0

यह एक सीधा जवाब नहीं है, लेकिन एक समाधान है। 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.

-2

अंदर से निष्पादित नहीं, लेकिन करीब;)

<?php

$var = (function(){ echo 'do something'; });
$var();

?>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.