सवाल आप PHP में अज्ञात कार्यों का उपयोग क्यों करते हैं?


अज्ञात कार्य PHP 5.3 से उपलब्ध हैं।
क्या मुझे उनका इस्तेमाल करना चाहिए या उनसे बचें? यदि हां, तो कैसे?

संपादित; बस PHP अज्ञात कार्यों के साथ कुछ अच्छी चाल मिली ...

$container           = new DependencyInjectionContainer();
$container->mail     = function($container) {};
$conteiner->db       = function($container) {};
$container->memcache = function($container) {};

44
2018-03-09 20:27


मूल


मैन, मुझे उस निर्भरता इंजेक्शन का उपयोग बिल्कुल नहीं मिलता है। - Kzqai
@Tchalvak, क्यों? मेरे लिए यह लागू करना और उपयोग करना वास्तव में आसान है। क्या कोई जाल है? - Kirzilla
@Kirzilla $container = new DependencyInjectionContainer(); इसका गुमनाम कार्यों के साथ कुछ लेना देना नहीं है - Uzair Farooq


जवाब:


बेनामी कार्य उन कार्यों का उपयोग करते समय उपयोगी होते हैं जिनकी आवश्यकता होती है कॉलबैक फ़ंक्शन पसंद array_filter या array_map कर:

$arr = range(0, 10);
$arr_even = array_filter($arr, function($val) { return $val % 2 == 0; });
$arr_square = array_map(function($val) { return $val * $val; }, $arr);

अन्यथा आपको उस फ़ंक्शन को परिभाषित करने की आवश्यकता होगी जिसे आप संभवतः केवल एक बार उपयोग करते हैं:

function isEven($val) { return $val % 2 == 0; }
$arr_even = array_filter($arr, 'isEven');
function square($val) { return $val * $val; }
$arr_square = array_map('square', $arr);

85
2018-03-09 20:36



ऐसा लगता है कि मैंने अज्ञात कार्यों के उद्देश्य के बारे में कभी भी सबसे अधिक जवाब दिया है। यह इस तथ्य को रेखांकित करता है कि अधिकांश एक बार / एक-स्थान समाधान के लिए, अज्ञात फ़ंक्शंस आपको कोड को सही रखने की अनुमति देता है, जहां इसका उपयोग किया जाता है, इसे किसी एक स्थान पर परिभाषित करने और किसी अन्य में कॉल करने की आवश्यकता के बिना। यह बेहद उपयोगी हो जाता है, यदि आपके पास एक परियोजना में सैकड़ों या हजारों में गिना जाता है। - trejder


अज्ञात कार्य PHP 5.3 से उपलब्ध हैं।

लंबे समय तक PHP में बेनामी फ़ंक्शन उपलब्ध हैं: create_function PHP 4.0.1 के बाद से आसपास रहा है। हालांकि आप बिल्कुल सही हैं कि PHP 5.3 के रूप में एक नई अवधारणा और वाक्यविन्यास उपलब्ध है।

क्या मुझे उनका इस्तेमाल करना चाहिए या उनसे बचें? यदि हां, तो कैसे?

यदि आपने कभी भी उपयोग किया है create_function इससे पहले, फिर नया सिंटैक्स बस उस स्थान पर जा सकता है जहां आपने इसका उपयोग किया था। जैसा कि अन्य उत्तरों का उल्लेख किया गया है, एक सामान्य मामला 'फेंकने' कार्यों के लिए है जहां उन्हें केवल एक बार उपयोग किया जाना चाहिए (या कम से कम एक ही स्थान पर)। आम तौर पर पसंद के लिए कॉलबैक के रूप में आता है array_map/को कम/फिल्टर, preg_replace_callback, usort, आदि..

शब्दों में अक्षरों की संख्या की गणना करने के लिए अज्ञात कार्यों का उपयोग करने का उदाहरण (यह कई अन्य तरीकों से किया जा सकता है, यह केवल एक उदाहरण है):

$array = array('apple', 'banana', 'cherry', 'damson');

// For each item in the array, count the letters in the word
$array = array_map(function($value){
    $letters = str_split($value);
    $counts  = array_count_values($letters);
    return $counts;
}, $array);

// Sum the counts for each letter
$array = array_reduce($array, function($reduced, $value) {
    foreach ($value as $letter => $count) {
        if ( ! isset($reduced[$letter])) {
            $reduced[$letter] = 0;
        }
        $reduced[$letter] += $count;
    }
    return $reduced;
});

// Sort counts in descending order, no anonymous function here :-)
arsort($array);

print_r($array);

जो देता है (ब्रेवटी के लिए snipped):

Array
(
    [a] => 5
    [n] => 3
    [e] => 2
    ... more ...
    [y] => 1
)

23
2018-03-09 21:20



Usort के लिए +1, यह एक अच्छा उपयोग है। - Kzqai
@salathe तो .. कॉलबैक कार्यों के साथ काम करने के अलावा, अज्ञात समारोह बेकार हैं? मुझे बस इतना नहीं मिला कि प्रचार क्या था - samayo


शायद आप सिर्फ PHP के लेख को पढ़ सकते हैं बेनामी कार्य। यह वास्तव में बहुत अच्छा है।


9
2018-03-09 20:33



हम्म, PHP दस्तावेज के लिए, यह वास्तव में एक अच्छा लेख है। - Kzqai
हाँ वास्तव में बहुत अच्छी तरह से समझाया - Rahat Ali


बेनामी फ़ंक्शन भी डी कंटेनर में फ़ंक्शन बनाने में बहुत उपयोगी हो सकते हैं, उदाहरण के लिए "bootstrap.php":

//add sessions
$di->add("session",function(){ return new Session(); });
//add cache
$di->add("cache",function(){ return new Cache(); });
//add class which will be used in any request
$di->add("anyTimeCalledClass", new SomeClass());

उपयोग पैरा, और अगले चर के साथ उदाहरण

$di->add("myName",function($params) use($application){
      $application->myMethod($params);
});

तो यहां आप देख सकते हैं कि स्मृति और सर्वर के लोड को बचाने के लिए आप अज्ञात फ़ंक्शंस का उपयोग कैसे कर सकते हैं। आप सभी महत्वपूर्ण प्लगइन्स, कक्षाओं को परिभाषित कर सकते हैं di कंटेनर, लेकिन अगर आपको इसकी आवश्यकता हो तो उदाहरण बनाए जाएंगे।


4
2018-06-01 23:14



हैलो @brasofilo, क्या आप थोड़ा और समझा सकते हैं? मैं अंतर को समझने में सक्षम नहीं हूं। - San
@San अंतर उदाहरण के रूप में उदाहरण है: $ di-> जोड़ें ('सेवा', नया ऑब्जेक्ट ()); वस्तु का उदाहरण डी कंटेनर में संग्रहीत किया जाता है। जब आप $ di-> जोड़ देंगे ('सेवा', फ़ंक्शन () {नया ऑब्जेक्ट () वापस लौटें;}); ऑब्जेक्ट का उदाहरण "अनुरोध" पर बनाया गया है, इसलिए अंतर यह है कि आप डी में सभी सेवाओं को पंजीकृत कर सकते हैं और पंजीकृत सेवाओं मेमोरी को संसाधित नहीं करेंगे, क्योंकि उदाहरण अभी तक नहीं बनाए गए हैं। कई मामलों में देव, सेवाओं को पंजीकरण करने के लिए, लेकिन प्रत्येक अनुरोध पर सेवा बनाई गई है, और यह प्रक्रिया निष्पादन धीमा कर रही है। जब आपके पास अनाम कार्य होता है तो कुछ भी नहीं बनाया जाता है। - Kamil
आपका बहुत बहुत धन्यवाद! - San


अज्ञात कार्यों का एक सामान्य उपयोग कॉलबैक फ़ंक्शन है। उदाहरण के लिए, आप फ़ंक्शन में सॉर्ट एल्गोरिदम से कॉलबैक के लिए उनका उपयोग कर सकते हैं uksort ( http://lv.php.net/uksort ) या जैसे एल्गोरिदम को बदलना preg_replace_callback ( http://lv.php.net/manual/en/function.preg-replace-callback.php )। PHP में खुद को कोशिश नहीं की है, तो यह सिर्फ एक अनुमान है।


2
2018-03-09 20:30





PHP में अज्ञात कार्यों का उपयोग करके नमूना उदाहरण यहां दिया गया है

$suppliers=['add1'=>'nodia','add2'=>'delhi', 'add3'=>'UP'];
 $getAddress = function($suppliers){ $address=[];
 for($i=1;$i<5;$i++){
  if(array_key_exists('add'.$i, $suppliers))
    $address[]=$suppliers['add'.$i];
  }
 return $address;};
 print_r($getAddress($suppliers));

उपरोक्त उदाहरण में हमने अनाम कार्यों को लिखा है जो जांचते हैं कि इनपुट सरणी में कोई कुंजी मौजूद है या नहीं। यदि यह मौजूद है तो यह आउटपुट सरणी में डाल देगा।


0
2018-01-24 07:14